常见问题:MySQL/排序

MySQL的排序分为两种,通过排序操作和按索引扫描排序。

按索引顺序扫描是一种很高效的方式,但使用的条件较为严格,只有orderby语句使用索引最左前列,或where语句与orderby语句条件列组合满足索引最左前列时,才会按索引顺序扫描。

此外,以下情况不能按索引扫描:

  1. 如果索引不能覆盖查询所需的全部列,那么就无法使用按索引扫描排序。故关联表查询时,只有当order by子句引用的字段全部为第一个表时,才会使用索引做排序。
  2. 只有当索引的列顺序和order by子句的顺序完全一致,并且所有列的排序方向都一样时,mysql才能使用索引来对结果排序。(除非前列为常量,但这样的操作是否索引生效,因数据库而异不推荐)

举一个前列为常量,第二列索引有效的例子

-- 第一列提供常量条件,使用第二列进行排序,这两列组合在一起,形成索引最左前缀,所以可以索引排序,没有出现filesort
EXPLAIN SELECT rental_id, staff_id FROM rental
WHERE rental_date = '2005-05-25'
ORDER BY inventory_id DESC;
posted @ 2019-09-10 21:17  CieloSun  阅读(236)  评论(0编辑  收藏  举报