Mysql索引Group by命中分析

今天遇到一个问题,开始觉得很奇怪,索引都建上了,但还是导致了全表扫描。

给A字段单独建立了索引,B(日期),C字段建立了联合索引。

SELECT SUM(price) FROM TABLE WHERE B >= '2017-10-01' AND B < '2017-11-01' AND C='test' group by B,A;

发现并没有命中索引,将GROUP里的A,去掉,发现可以命中B,C的联合索引,或者在table后面加上force index(idx_b_c)也可以强制索引生效。

查看了以下文章,主要问题都是 mysql loose index scan的问题。

Group by何时使用loose index scan?

适用条件:

1 针对单表操作

2 Group by使用索引的最左前缀列

3 只支持聚集函数min()/max()

4 Where条件出现的列必须为=constant操作 , 没出现在group by中的索引列必须使用constant

5 不支持前缀索引,即部分列索引 ,如index(c1(10))

这个问题原因是GROUP BY里面的字段不是索引的最左前缀列,导致了全表扫描。

发表评论

电子邮件地址不会被公开。 必填项已用*标注