MySQL优化之group by

本文深入解析SQL中groupby操作的原理及其三种实现形式:松散索引扫描、紧凑索引扫描和完全无法使用索引,并详细解释每种形式的特点和前提条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值