前天在微薄上发了个优化器的问题,从评论来看,还是需要简单说明一下。
现象说明
其实这里主要要说明的是一个优化器还需要改进的地方。
优化器会根据where条件和select_list里面的字段决定在使用一个索引(sta)后,是否需要回表—回到聚集索引取数据。
基本的做法是:在确定了一个索引后,将select_list和where中出现的所有字段都拿来判断一下,如果字段都存在于sta索引中,则可以使用覆盖索引。
第一个explan可以用上覆盖索引(Using Index), 是因为select_list里面只有count(*),而count(*)在语法解析阶段就被特殊处理,不作为特殊字段。
第二个字段在现在的实现中,因为gmt不是sta索引的一部分(sta索引定义上只有sta一个字段,算上聚集索引结构,就是sta,auci)。所以最后判定为不能使用覆盖索引。
性能差别
表中放入500w数据以后,这两个查询的时间相差25倍(0.19s vs 5s)。
存在改进
其实我说这个“不科学”,是因为第二个语句居然不能使用覆盖索引。按照count(gmt)的语义,是计算gmt不为NULL的所有行的数目。但是表定义中,分分明已经说明了gmt为not null。那么就可以转成count(*)了!
目前因为count、sum、count(distinct)这些操作的处理方法被揉在一起,因此没有特别分开。
应用警惕
好在按照正常的习惯,需要计算总数时,最多是count(auci)或者count(*), 不会故意去count一个别的字段。当时若使用的是MyISAM,就需要小心了。
从上面的分析可以推测得到,如果这是个MyISAM表,还是一样的where条件,count(*)是可以使用覆盖索引的,但是count(auci)就不行了。
相关推荐
MySQL之高效覆盖索引
mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化mysql 性能优化...
MySQL查询优化技术_索引
有这样的一个需求:select count(distinct nick) from user_access_xx_xx; 这条sql用于统计用户访问的uv,由于单表的数据量在10G以上,即使在user_access_xx_xx上加上nick的索引, 通过查看执行计划,也为全索引扫描...
MySQl索引优化课件,详细得介绍了MySQl索引优化数据库
04-VIP-Mysql索引优化实战一.pdf
10. 编译和安装MYSQL 11. 维护 12. 优化SQL 13. 不同SQL服务器的速度差别(以秒计) 14. 重要的MYSQL启动选项 15. 优化表 16. MYSQL如何次存储数据 17. MYSQL表类型 18. MYSQL行类型(专指IASM/MYIASM表) ...
有关mysql索引优化方面的文档,比较实用,希望能够对大家有帮助。
使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询 注意 1、覆盖索引也并不适用于任意的索引类型,索引必须存储列的值 2...
Mysql优化 课程目录:【】Mysql优化 资料【】Mysql优化01关键技术【】Mysql优化02表的设计【】Mysql优化03慢查询(一)【】Mysql优化04慢查询(二)【】Mysql优化05慢查询(三)【】Mysql优化06索引(一)【】Mysql优化07...
描述 MySQL 查询优化器的工作原理。 MySQL 查询优化器主要为执行的查询决断最有效的路线
05-VIP-Mysql索引优化实战二.pdf
关于mysql索引一些优化介绍与创建原则,还有对order by排序的算法的介绍等等
MySQL索引分析和优化.pdf 记录自己在学习过程中看过的书欢迎下载
mysql优化从以下几个方面介绍 mysql的架构 索引优化分析 查询截取分析 mysql锁机制 主从复制
一:union all 肯定是能够命中索引的 二:简单的in能够命中索引 三:对于or,新版的MySQL能够命中索引 四、对于!=,负向查询肯定不能命中索引 五、其他方案
Mysql的索引及优化策略,个人感觉还不错
mysql性能优化-慢查询分析、优化索引和配置
Mysql索引优化案例.pdf
mysql日常使用过程中遇到的问题,以及解决办法,包括discount的bug,avg(null),紧凑索引,松散索引,以及索引优化