在 SO,最近有人问为什么 ORDER BY 不使用索引?
这种情况涉及 MySQL 中的一个简单的 InnoDB 表,包括三列和 10k 行。其中一列,一个整数,被索引——OP 试图检索他在该列上排序的整个表:
SELECT * FROM person ORDER BY age
Run Code Online (Sandbox Code Playgroud)
他附上了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 …