1

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

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

当我做这样的查询时......

SELECT firstname, lastname FROM table ORDER BY lastname ASC, firstname ASC, age DESC

... MySQL 不使用索引。

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

SELECT firstname, lastname FROM table ORDER BY lastname ASC, firstname ASC, age ASC

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

提前致谢!

4

1 回答 1

5

此时(MySQL 5.6 及更低版本)索引都是按升序实现的。

如果在 ORDER 子句中混合顺序(ASC 与 DESC),则索引不能在顺序更改的点之外使用。

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

您可以添加另一个具有反向年龄 (max_age - age) 的列,并对其进行索引,以便您可以对所有列使用 ASC。

于 2012-08-02T14:54:22.793 回答