按列排序是否应该有索引?

Som*_*luk 42 mysql performance index order-by

我已经向表中添加了用于搜索结果的索引。我按 ASC 或 DESC 顺序显示结果。那么该列是否应该有索引?我在那个表上还有 2 个索引。对该列建立或不建立索引对性能有何影响?

Aar*_*own 33

是的,MySQL 可以在 ORDER BY 中的列上使用索引(在某些条件下)。但是,MySQL 不能将索引用于混合ASC,DESC order by ( SELECT * FROM foo ORDER BY bar ASC, pants DESC)。分享您的查询和 CREATE TABLE 语句将有助于我们更具体地回答您的问题。

有关如何优化 ORDER BY 子句的提示:http : //dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

编辑 2012-01-21 8:53AM

关于在 ORDER BY 中使用混合 ASC/DESC 的索引的声明的来源存在问题。来自ORDER BY 优化文档:

在某些情况下,MySQL 无法使用索引来解析 ORDER BY,尽管它仍然使用索引来查找与 WHERE 子句匹配的行。这些案例包括:

...

你混合 ASC 和 DESC:

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

...

此外, DESC 关键字在 CREATE INDEX 中没有意义

index_col_name 规范可以以 ASC 或 DESC 结尾。这些关键字允许用于指定升序或降序索引值存储的未来扩展。目前,它们被解析但被忽略;索引值始终按升序存储。

  • **MySQL 8.0 的新功能**:现在它可以混合使用`ASC` 和`DESC` _if_`INDEX` 具有相同的混合。 (4认同)
  • *“MySQL 不能为混合的 ASC、DESC 使用索引”*。参考这个? (3认同)
  • MySQL 在 CREATE INDEX 中解析 asc & Desc,但忽略它们。索引总是按升序存储。http://dev.mysql.com/doc/refman/5.5/en/create-index.html (3认同)

小智 9

对于任何想知道与 PostgreSQL 相关的答案的人来说,答案是肯定的,将使用索引。根据PostgreSQL 文档,查询规划器“将考虑通过扫描与规范匹配的可用索引,或通过按物理顺序扫描表并进行显式排序来满足 ORDER BY 规范。” 这意味着如果有一个规划器可以使用的索引,它会这样做,在检索匹配的行后回退到进行排序。