MySQL优化:explain using temporary

什么时候会使用临时表:group/order没设计好的时候

1.order没用索引

2.order用了索引, 但不是和where相同的索引

3.order用了两个索引, 但不是联合索引

4.order用了联合索引, 但排序顺序不同序 

原因:

1.不用说

2.mysql一次只能用一个索引

3.4 其实原因一样, 和索引的结构有关:

索引是一个B+树, 比如一个联合索引如下(x, y):

(2, 5) - (6, 10)  (7, 3) - (10, 19) ...

如果是联合索引, 排序同序, 取结果的时候直接从B+树从后向前或者从前向后取就可以了,

但如果是两个索引, 显然不能直接从一个B+树取值. 

如果顺序不相同, 例如ASC, DESC, 有两个索引(2, 5), (2,7), 当Mysql取到第一个(2,5)时, 并不知道后面还有没有(2, x), 所以不能先把(2, 5)返回, 这时候就要用到temporary来先存着(2, 5)这行, 等(2, x)都被查出来了, 再把临时表从后向前返回.

posted @ 2017-03-10 10:38  长乐忘忧  阅读(774)  评论(0编辑  收藏  举报