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

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

 2009-03-26 11:18:27 来源:WEB开发网   
核心提示: 前面两种 GROUP BY 的实现方式都是在有可以利用的索引的时候使用的,当 MySQL Query Optimizer 无法找到合适的索引可以利用的时候,详解MySQL分组查询Group By实现原理(4),就不得不先读取需要的数据,然后通过临时表来完成 GROUP BY 操作,只能先通

前面两种 GROUP BY 的实现方式都是在有可以利用的索引的时候使用的,当 MySQL Query Optimizer 无法找到合适的索引可以利用的时候,就不得不先读取需要的数据,然后通过临时表来完成 GROUP BY 操作。

1 sky@localhost : example 09:02:40> EXPLAIN
2 
3 -> SELECT max(gmt_create)
4 
5 -> FROM group_message
6 
7 -> WHERE group_id > 1 and group_id < 10
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: range
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: NULL
28 
29 rows: 32
30 
31 Extra: Using where; Using index; Using temporary; Using filesort
 

这次的执行计划非常明显的告诉我们 MySQL 通过索引找到了我们需要的数据,然后创建了临时表,又进行了排序操作,才得到我们需要的 GROUP BY 结果。整个执行过程大概如下图所展示:

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

当 MySQL Query Optimizer 发现仅仅通过索引扫描并不能直接得到 GROUP BY 的结果之后,他就不得不选择通过使用临时表然后再排序的方式来实现 GROUP BY了。

在这样示例中即是这样的情况。 group_id 并不是一个常量条件,而是一个范围,而且 GROUP BY 字段为 user_id。所以 MySQL 无法根据索引的顺序来帮助 GROUP BY 的实现,只能先通过索引范围扫描得到需要的数据,然后将数据存入临时表,然后再进行排序和分组操作来完成 GROUP BY。

上一页  1 2 3 4 

Tags:详解 MySQL 分组

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