相关疑难解决方法(0)

索引是否必须覆盖所有选定的列才能用于 ORDER BY?

在 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 indexExtra列中指示的EXPLAIN输出)。后来给出了一个解释,遍历索引然后从表中获取列会导致随机 I/O,MySQL 认为这比filesort.

这似乎与关于ORDER BY优化的手册章节背道而驰,它不仅传达了强烈的印象,即满足ORDER BY索引比执行额外排序更可取(实际上,filesort是快速排序和归并排序的组合,因此 必须有一个下限; 虽然按顺序遍历索引并寻找表应该是 - 所以这是完全有道理的),但它也忽略了这种所谓的“优化”,同时还说明了:Ω(nlog n)O(n)

以下查询使用索引来解析ORDER …

mysql innodb index order-by

16
推荐指数
2
解决办法
5816
查看次数

标签 统计

index ×1

innodb ×1

mysql ×1

order-by ×1