MySQL优化之group by

group by原理:先做order by操作,然后进行分组。

group by有三种实现形式,松散索引扫描,紧凑索引扫描和完全无法使用索引。

松散索引扫描 

松散索引扫描的松散的意思其实就是不用扫描所有满足条件的索引,每组索引可能有多个,但是只需要扫描每组的第一个或者最后一个即可。

比如:有这样一个索引IDX_ID_NAME_ADDR

select max(addr) from table where id < 10  group id,name ,比如说id = 5 name = 'test’的数据有十条算这组最大值的时候不用把10条全部取出来,都是本身索引就是有顺序的,所以只要选择最后一条数据即可。

这个名词的意思很容易忘记它的含义,而且看官方手册的时候新人很难看懂说的是啥。

只有明白了原理再去看官方手册,觉得奥原来是这样。

不过有个特点就是执行计划的extra里面显示的是:using index for group-by

松散索引的前提:

1.group by条件的字段必须在同一个索引中最前面的连续位置

2.在使用group by的同时,只能使用max和min这两个聚合函数

3.如果引用了该索引中group by条件之外的字段的时候,必须以常量的条件存在。

紧凑索引扫描:

紧凑索引扫描和上面不同,它需要读取该组内所有满足条件的索引。

比如group by id 如果id = 5 有十条索引满足,则十条全部读取出来。

紧凑索引扫描前提:

group by的字段不连续或者不是索引前缀,但是空缺的地方用常量来填充。

完全无法使用索引:

特点执行计划之中 extra:using temporary;using filesort

猜你喜欢

转载自labreeze.iteye.com/blog/2219900