在 SO,最近有人问为什么 ORDER BY 不使用索引?
这种情况涉及 MySQL 中的一个简单 InnoDB 表,该表包含三列和 10k 行。其中一列,一个整数,被索引了——并且 OP 试图检索他在该列上排序的整个表:
SELECT * FROM person ORDER BY age
他附加EXPLAIN
的输出显示这个查询是用 a filesort
(而不是索引)解决的,并询问为什么会这样。
尽管提示 FORCE INDEX FOR ORDER BY (age)
导致使用索引,但有人回答(带有其他人的支持评论/赞成票)索引仅用于从索引中读取所有选定列时的排序(即通常Using index
在Extra
列中表示EXPLAIN
输出)。后来给出了一个解释,即遍历索引然后从表中获取列会导致随机 I/O,MySQL 认为这比filesort
.
这似乎与ORDER BY
优化的手册章节背道而驰,它不仅传达了一种强烈的印象,即ORDER BY
从索引中满足比执行额外的排序更可取(实际上,filesort
它是快速排序和合并排序的组合,因此 必须有一个下限; 虽然按顺序遍历索引并查找表应该是 - 所以这很有意义),但它也忽略了提到这个所谓的“优化”,同时还说明:Ω(nlog n)
O(n)
以下查询使用索引来解析
ORDER BY
部件:SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;
根据我的阅读,在这种情况下正是这种情况(但在没有明确提示的情况下没有使用索引)。
我的问题是:
为了让 MySQL 选择使用索引,是否确实需要对所有选定的列进行索引?
如果是这样,这在哪里记录(如果有的话)?
如果不是,这里发生了什么?