<b>MySQL Group By 实现原理解析</b>[MySQL防范]
本文“<b>MySQL Group By 实现原理解析</b>[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
由于 GROUP BY 实际上也一样会举行排序操作,并且与 ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作.当然,假如在分组的时刻还利用了其他的一些聚合函数,那么还需求一些聚合函数的计算.所以,在GROUP BY 的实现历程中,与 ORDER BY 一样也可以操纵到索引.
在 MySQL 中,GROUP BY 的实现一样有多种(三种)方法,此中有两种方法会操纵现有的索引信息来完成 GROUP BY,别的一种为完好无法利用索引的场景下利用.下面我们辨别针对这三种实现方法做一个解析.
1.利用疏松(Loose)索引扫描实现 GROUP BY
何谓疏松索引扫描实现 GROUP BY 呢?实际上就是当 MySQL 完好操纵索引扫描来实现 GROUP BY 的时刻,并不需求扫描全部满意条件的索引键便可完成操作得出后果.
下面我们通过一个示例来描写疏松索引扫描实现 GROUP BY,在示例之前我们需求首先调整一下 group_message 表的索引,将 gmt_create 字段增添到 group_id 和 user_id 字段的索引中:
1
sky@localhost : example 08:49:45>
create
index idx_gid_uid_gc 2 3 -> on group_message(group_id,user_id,gmt_create); 4 5 Query OK, rows affected (0.03 sec) 6 7 Records: 96 Duplicates: 0 Warnings: 0 8 9 sky@localhost : example 09:07:30> drop index idx_group_message_gid_uid 10 11 -> on group_message; 12 13 Query OK, 96 rows affected (0.02 sec) 14 15 Records: 96 Duplicates: 0 Warnings: 0 |
然后再看以下 Query 的履行筹划:
1
sky@localhost : example 09:26:15> EXPLAIN 2 3 -> SELECT user_id,max(gmt_create) 4 5 -> FROM group_message 6 7 -> WHERE group_id < 10 8 9 -> GROUP BY group_id,user_id\G 10 11 *************************** 1. row *************************** 12 13 id: 1 14 15 select_type: SIMPLE 16 17 table: group_message 18 19 type: range 20 21 possible_keys: idx_gid_uid_gc 22 23 key: idx_gid_uid_gc 24 25 key_len: 8 26 27 ref: NULL 28 29 rows: 4 30 31 Extra: Using where; Using index for group-by 32 33 1 row in set (0.00 sec) |
我们看到在履行筹划的 Extra 信息中有信息显示“Using index for group-by”,实际上这就是奉告我们,MySQL Query Optimizer 通过利用疏松索引扫描来实现了我们所需求的 GROUP BY 操作.
下面这张图片描绘了扫描历程的大约实现:
要操纵到疏松索引扫描实现 GROUP BY,需求至少满意以下几个条件:
◆GROUP BY 条件字段必须在同一个索引中最前面的持续位置;
◆在利用GROUP BY 的同时,只能利用 MAX 和 MIN 这两个聚合函数;
◆假如引用到了该索引中 GROUP BY 条件之外的字段条件的时刻,必须以常量情势存在;
为什么疏松索引扫描的效率会很高?
因为在没有WHERE子句,也就是必须经过全索引扫描的时刻, 疏松索引扫描需求读取的键值数目与分组的组数目一样多,也就是说比实际存在的键值数目要少量多.而在WHERE子句包含范围判断式大概等值表达式的时刻, 疏松索引扫描查找满意范围条件的每个组的第1个关键字,并且再次读取尽大概最少数目的关键字.
以上是“<b>MySQL Group By 实现原理解析</b>[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |