使用索引扫描来做排序

MySQL 有两种方式可以生成有序的结果:通过排序操作,或者按索引顺序扫描如果在 EXPLAIN 的输出结果中,type 列的值为 “index”,则说明 MySQL 使用了索引扫描来做排序。

扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录。但如果索引不能覆盖查询所需的全部列,那么就不得不每扫描一条索引记录都回表查询一次对应的记录。这基本上都是随机 I/O,因此按索引顺序读取数据的速度通常要比顺序地全表扫描慢,尤其是在 I/O 密集型的应用负载上

MySQL 可以使用同一个索引既满足排序,又用于查找行。因此,如果可能,设计索引时应该尽可能地同时满足这两项任务,这样是最好的。

  • 只有当索引的顺序和 ORDER BY 子句的顺序完全一致,并且所有列的排序方向(倒序或正序)都一样时,MySQL 才能使用索引来对结果做排序。

  • 如果查询需要联接多张表,则只有当 ORDER BY 子句引用的字段全部在第一个表中时,才能使用索引做排序。

  • ORDER BY 子句和查找型查询的限制是一样的:需要满足索引的最左前缀的要求,否则,MySQL 需要执行排序操作,而无法利用索引排序。

    有一种特殊情况,如果前导列为常量的时候,ORDER BY 子句中的列也可以不满足索引的最左前缀的要求。如果在 WHERE 子句或者 JOIN 子句中将这些列指定为了常量,就可以“填补”索引字段的间隙了。

最后更新于