最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

MySQL优化器中一个Count和覆盖索引的问题_MySQL

来源:动视网 责编:小采 时间:2020-11-09 18:35:36
文档

MySQL优化器中一个Count和覆盖索引的问题_MySQL

MySQL优化器中一个Count和覆盖索引的问题_MySQL:bitsCN.com MySQL优化器中一个Count和覆盖索引的问题 现象说明 其实这里主要要说明的是一个优化器还需要改进的地方。 优化器会根据where条件和select_list里面的字段决定在使用一个索引(sta)后,是否需要回表—回到聚集索引取数据。 基本的做法
推荐度:
导读MySQL优化器中一个Count和覆盖索引的问题_MySQL:bitsCN.com MySQL优化器中一个Count和覆盖索引的问题 现象说明 其实这里主要要说明的是一个优化器还需要改进的地方。 优化器会根据where条件和select_list里面的字段决定在使用一个索引(sta)后,是否需要回表—回到聚集索引取数据。 基本的做法
 bitsCN.com

MySQL优化器中一个Count和覆盖索引的问题

现象说明

其实这里主要要说明的是一个优化器还需要改进的地方。

优化器会根据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)就不行了。

bitsCN.com

文档

MySQL优化器中一个Count和覆盖索引的问题_MySQL

MySQL优化器中一个Count和覆盖索引的问题_MySQL:bitsCN.com MySQL优化器中一个Count和覆盖索引的问题 现象说明 其实这里主要要说明的是一个优化器还需要改进的地方。 优化器会根据where条件和select_list里面的字段决定在使用一个索引(sta)后,是否需要回表—回到聚集索引取数据。 基本的做法
推荐度:
标签: 的问题 mysql 优化
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top