MySQL中Order By实现原理分析
2009-03-27 11:18:24 来源:WEB开发网MySQL 从 Table A 中取出了符合条件的数据,由于取得的数据并不满足ORDER BY 条件,所以MySQL进行了 filesort 操作,其整个执行过程如下图所示:
在MySQL 中,filesort 操作还有一个比较奇怪的限制,那就是其数据源必须是来源于一个Table,所以,如果我们的排序数据如果是两个(或者更多个) Table 通过Join所得出的,那么 MySQL 必须通过先创建一个临时表(Temporary Table),然后再将此临时表的数据进行排序,如下例所示:
1 sky@localhost : example 02:46:15> explain select A.* from A,B
2
3 -> where A.c1 > 2 and A.c2 < 5 and A.c2 = B.c2 order by B.c3G
4
5 *************************** 1. row ***************************
6
7 id: 1
8
9 select_type: SIMPLE
10
11 table: A
12
13 type: range
14
15 possible_keys: PRIMARY
16
17 key: PRIMARY
18
19 key_len: 4
20
21 ref: NULL
22
23 rows: 3
24
25 Extra: Using where; Using temporary; Using filesort
26
27 *************************** 2. row ***************************
28
29 id: 1
30
31 select_type: SIMPLE
32
33 table: B
34
35 type: ref
36
37 possible_keys: B_c2_ind
38
39 key: B_c2_ind
40
41 key_len: 7
42
43 ref: example.A.c2
44
45 rows: 2
46
47 Extra: Using where
这个执行计划的输出还是有点奇怪的,不知道为什么,MySQL Query Optimizer 将 “Using temporary” 过程显示在第一行对Table A 的操作中,难道只是为让执行计划的输出少一行?
实际执行过程应该是如下图所示:
更多精彩
赞助商链接