ORDER BY的方向阻止MySQL使用索引

caw*_*caw 1 mysql indexing sql-order-by

在一个MySQL数据库表中,我具有以下索引:

  • 类型:BTREE
  • 独特:否
  • 包装:否
  • 字段:姓氏,名字,年龄

当我做这样的查询...

SELECT firstname, lastname FROM table ORDER BY lastname ASC, firstname ASC, age DESC
Run Code Online (Sandbox Code Playgroud)

... MySQL不使用索引。

但是当我也按升序使用“年龄”时,它会:

SELECT firstname, lastname FROM table ORDER BY lastname ASC, firstname ASC, age ASC
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?列是否总是仅按升序编制索引?或者我也可以按降序使用它们吗?为什么不能使用混合订单?

提前致谢!

Mar*_*ams 5

目前(MySQL 5.6及更低版本)索引均按升序实现。

如果在ORDER子句中混合使用顺序(ASC与DESC),则无法在顺序更改的地方使用索引。

如果指定所有ASC,则可以充分利用索引,如果指定所有DESC,则仍可以充分利用索引,只有MySQL会向后遍历索引。

您可以添加另一列具有相反年龄(max_age-age)的列,并在其上建立索引,以便可以对所有列使用ASC。