什么时候会使用临时表: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)都被查出来了, 再把临时表从后向前返回.