WEB开发网
开发学院数据库MySQL 详解MySQL分组查询Group By实现原理 阅读

详解MySQL分组查询Group By实现原理

 2009-03-26 11:18:27 来源:WEB开发网   
核心提示: 我们看到在执行计划的 Extra 信息中有信息显示“Using index for group-by”,实际上这就是告诉我们,详解MySQL分组查询Group By实现原理(2),MySQL Query Optimizer 通过使用松散索引扫描来实现了我们所需要的

我们看到在执行计划的 Extra 信息中有信息显示“Using index for group-by”,实际上这就是告诉我们,MySQL Query Optimizer 通过使用松散索引扫描来实现了我们所需要的 GROUP BY 操作。

下面这张图片描绘了扫描过程的大概实现:

详解MySQL分组查询Group By实现原理

要利用到松散索引扫描实现 GROUP BY,需要至少满足以下几个条件:

◆GROUP BY 条件字段必须在同一个索引中最前面的连续位置;

◆在使用GROUP BY 的同时,只能使用 MAX 和 MIN 这两个聚合函数;

◆如果引用到了该索引中 GROUP BY 条件之外的字段条件的时候,必须以常量形式存在;

为什么松散索引扫描的效率会很高?

因为在没有WHERE子句,也就是必须经过全索引扫描的时候, 松散索引扫描需要读取的键值数量与分组的组数量一样多,也就是说比实际存在的键值数目要少很多。而在WHERE子句包含范围判断式或者等值表达式的时候, 松散索引扫描查找满足范围条件的每个组的第1个关键字,并且再次读取尽可能最少数量的关键字。

2.使用紧凑(Tight)索引扫描实现 GROUP BY

紧凑索引扫描实现 GROUP BY 和松散索引扫描的区别主要在于他需要在扫描索引的时候,读取所有满足条件的索引键,然后再根据读取恶的数据来完成 GROUP BY 操作得到相应结果。

1  sky@localhost : example 08:55:14> EXPLAIN
2 
3 -> SELECT max(gmt_create)
4 
5 -> FROM group_message
6 
7 -> WHERE group_id = 2
8 
9 -> GROUP BY user_idG
10 
11 *************************** 1. row ***************************
12 
13 id: 1
14 
15 select_type: SIMPLE
16 
17 table: group_message
18 
19 type: ref
20 
21 possible_keys: idx_group_message_gid_uid,idx_gid_uid_gc
22 
23 key: idx_gid_uid_gc
24 
25 key_len: 4
26 
27 ref: const
28 
29 rows: 4
30 
31 Extra: Using where; Using index
32 
33 1 row in set (0.01 sec)

上一页  1 2 3 4  下一页

Tags:详解 MySQL 分组

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接