`

提高MySQL索引策略一:隔离查询列

    博客分类:
  • db
 
阅读更多

在mysql中执行查询时,如果没有将查询条件(条件列)隔离出来,那么查询引擎则无法利用建立在该列上的索引进行数据获取.这里的"隔离"意味着查询条件字段不能作为表达式的一部分出现,所以,如果在查询语句中指定表达式条件,就必须单独将条件列置于表达式的一边.举个简单例子,

 

SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;

 ,mysql无法对上述的actor_id进行索引查询,尽管从人们能一眼看出actor_id为4,但是mysql不会对该表达式进行计算.这种计算完全靠你来完成的,你应该养成简化查询语句的习惯(很多很多),对于这条sql,actor_id应该单独位于等号的一边.

 

这里有个很常见的例子:

SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;

 这里的sql将数据库中date_col到当前时间10天之内的数据检索出来,date_col上的索引在这个情况下完全是不可用的,因为TO_DAYS()函数式无法利用索引的,可以将检索条件更改为如下:

SELECT ... WHERE date_col >= DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);

 date_col完全可以利用索引来提高查询效率.除了这些,还能做的就是将CURRENT_DATE替换为当前时间,我相信上层调用都能获取到当前时间(如果你不要求服务器时间和mysql时间一致),还有一个提交CURRENT_DATE的原因是mysql无法对该条sql进行缓存,毕竟不同日期sql的执行时间都是不一致的.

 

上面是high-performance-mysql中的章节翻译,下面就进行一些简单的测试(数据50w+,innodb,timestamp索引,字段唯一度0.35),首先是不对查询列进行隔离.

1.通过条件控制获取所有数据(588951):

select sql_no_cache count(...) where to_days(current_date) - to_days(update_time) < 100;
 执行时间:1s

 

2.获取一半数据(276009):

select sql_no_cache count(...) where to_days(current_date) - to_days(update_time) < 60;
 执行时间:0.99s

 

3.获取极少部分数据(20161);

 

select sql_no_cache count(...) where to_days(current_date) - to_days(update_time) < 41;
 执行时间:0.97s

 

 

下面是对update_time进行列隔离.

1.通过条件控制获取所有数据(588951):

select sql_no_cache count(...) where update_time > date_sub(current_date ,interval 100 day);
 执行时间:1.18s

 

2.获取一半数据量(288821):

select sql_no_cache count(...) where update_time > date_sub(current_date ,interval 60 day);

 执行时间:0.58s

3.获取极少数据(35220):

select sql_no_cache count(...) where update_time > date_sub(current_date ,interval 41 day);

 执行时间:0.07s

最后把索引去除,进行数据的获取(不管是数据的多寡),未进行隔离的查询为1.00s,而进行隔离的查询为1.10s,所以

可以看出,在有索引的字段上进行条件查询,最好将该字段至于表达式的一边,否则索引对于查询的高效将无法得到发挥(以上的sql执行时间都通过100次计算的平均值得出)

 

分享到:
评论

相关推荐

    mysql负载,查询优化,索引和锁等

    - **普通索引**(非唯一):提高查询速度,允许重复值。 - **全文索引**:适用于全文搜索,MySQL 5.6及以上版本支持。 - **复合索引**:使用多个列创建索引,按列顺序决定查询效率。 **4. 锁机制** MySQL的锁机制...

    MySQL 入门到高级:基础篇-尚硅谷 2021年

    - 索引的优化策略,理解EXPLAIN分析查询执行计划 4. **事务处理**: - 事务的概念,ACID特性(原子性、一致性、隔离性、持久性) - 事务的开始、提交、回滚操作 - 死锁的概念及其解决方案 5. **视图与存储过程...

    MySQL优化学习总结:索引原理、基本架构、日志实现、执行计划、锁机制、读取分离等.zip

    6. **读取分离**:为了提高数据库的并发性能,MySQL提供了读写分离策略。主服务器处理写操作,而从服务器处理读操作。这可以减轻主服务器的压力,但需要管理好数据同步,确保一致性。 了解这些概念只是MySQL优化的...

    MySQL高级_思维导图

    - **覆盖索引**:查询结果可以直接从索引中获取,无需访问数据行,提高查询效率。 - **前缀索引**:在字符串字段中仅使用开头的一部分创建索引,节省存储空间。 - **复合索引**:组合多个字段创建索引,适用于多...

    mysql性能优化视频教程

    - **分区表**:对于非常大的表,可以考虑使用分区技术提高查询效率。 - **定期优化表**:使用`OPTIMIZE TABLE`命令来整理表空间并重建索引。 3. **服务器配置优化**: - **内存管理**:合理设置缓冲池大小(`...

    MySQL面试题进阶版附答案高难度深入挖掘MySQL的核心概念与技术探索ACID特性、事务隔离级别、索引优化、连接操作

    - 使用索引可以显著提高查询速度,但也占用额外的存储空间,并可能影响数据插入、删除和更新的性能。 4. **连接操作**: - 内连接:只返回两个表中匹配的行。 - 左连接:返回左表的所有行,即使在右表中没有匹配...

    mysql索引,分布式事务,三阶段协议,b+树

    一、MySQL索引类型与原理 1. B+树(B+ Tree):MySQL中最常见的索引类型,尤其适用于主键索引和唯一索引。B+树是一种自平衡的树,所有数据都在叶子节点,非叶子节点只存储索引,这样可以实现快速查找。每个节点可...

    mysql面试题 mysql高级面试题 mysql面试题完整

    7. **覆盖索引**:如果查询的列完全包含在一个索引中,无需回表,这被称为覆盖索引,可以大大提高查询效率。 8. **唯一索引**:确保列中的每个值都唯一,可以提高查询效率,但可能影响插入性能,因为必须检查唯一性...

    【MySQL数据库】一条SQL语句为什么执行这么慢?

    合理地为查询涉及的字段创建索引可以大大提高查询速度。 2. **对字段进行函数操作** 在查询条件中对字段进行函数操作(如`DATE_FORMAT()`或`UPPER()`),会阻止MySQL使用索引,因为它无法直接比较索引值。尽量避免...

    MySQL 是怎样运行的:从根儿上理解 MySQL(上).pdf

    MySQL支持多种单表访问方式,如全表扫描、索引扫描等,根据查询条件和索引使用策略选择最佳访问方法。 11. **连接的原理** 当需要合并来自多个表的数据时,MySQL使用连接操作。它可以是笛卡尔积、内连接、外连接...

    MySQL常见面试题.pdf

    索引是如何提高查询速度的? 索引是通过哈希表或BTree数据结构存储索引,相当于将无序的数据变成相对有序的数据,可以加快查询速度。 大表的常见优化方法: 1. 限定数据的范围:务必禁用不带任何限制数据范围条件...

    mysql面试题(上)

    - 提高查询效率,类似书籍目录,使得数据查找更快。 - 创建唯一性索引保证数据唯一性。 - 避免排序和临时表,降低内存消耗。 - 将随机IO转换为顺序IO,减少磁盘访问次数。 4. 索引的底层数据结构: - **哈希表...

    mysql5.1.49

    - MySQL 5.1版本增强了查询优化器,提升了索引使用效率,支持更多的查询优化技术,如查询缓存、查询改写等,帮助提升数据库的整体性能。 9. **复制与集群**: - MySQL 5.1支持主从复制,可以实现数据的实时同步,...

    精心整理的MySQL 高频面试题

    了解`EXPLAIN`命令,分析查询计划,检查慢查询日志,使用索引分析工具如`pt-query-digest`,以及定期审查和调整索引策略,都是保持MySQL高效运行的关键步骤。 总的来说,掌握MySQL的索引机制、事务处理以及查询优化...

    MySQL面试总结宝典.pdf

    - **B树和B+树**:理解索引的数据结构,如何提高查询效率。 - **唯一索引与非唯一索引**:知道何时使用,它们的区别和影响。 - **前缀索引**:如何利用索引减少存储空间,同时保持查询性能。 - **复合索引与覆盖...

    mysql-常见问题,索引优化

    本文将探讨MySQL的一些常见问题,特别是与索引相关的优化策略。 1. 关于MySQL `count(distinct)` 的逻辑bug 在执行`count(distinct)`查询时,MySQL可能会遇到性能问题,尤其是在处理大量数据时。这是因为MySQL在...

    MYSQL 高级的资料

    本资料主要涵盖MySQL的高级特性,包括性能优化、存储引擎、事务处理、索引策略、备份与恢复、复制与集群等方面。 1. **性能优化**: - **SQL调优**:通过分析查询执行计划,优化查询语句,减少不必要的全表扫描,...

Global site tag (gtag.js) - Google Analytics