如果查询已包含 ORDER BY 1 列,使用带排序的索引的目的是什么?我们是否需要在索引中包含 ORDER BY 列?
对于按单列排序的查询,在创建索引时无需显式指定方向,因为数据库可以同等高效地向前和向后读取单列 B 树索引。这一能力消除了昂贵的 filesort 操作,因为索引已按顺序存储数据。当查询请求升序时,数据库从索引开头扫描;对于降序,则反向扫描同一索引。因此,为单列创建降序索引在性能上并无优于默认升序索引的优势。然而,当查询涉及多列且排序方向混合时,显式指定 ASC 或 DESC 变得至关重要。默认的复合索引可能无法高效支持具有混合排序需求的查询。为了优化此类查询,索引定义必须精确匹配查询中指定的排序方向。例如,一个按 score DESC 和 created_at ASC 排序的查询,需要显式定义为 (score DESC, created_at ASC) 的索引。总之,对于单列排序,创建普通索引即可,它们能高效处理升序和降序查询。对于多列排序且方向一致的情况,复合索引是合适的。当处理多列排序中的混合方向时,确保索引定义与查询的 ORDER BY 子句完全一致。这种方法通过避免昂贵的排序操作,保证了最佳性能。