【问题标题】:Direction of ORDER BY prevents MySQL from using indexORDER BY 的方向阻止 MySQL 使用索引
【发布时间】:2012-07-31 13:46:53
【问题描述】:

在一个 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

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

提前致谢!

【问题讨论】:

    标签: mysql indexing sql-order-by


    【解决方案1】:

    此时(MySQL 5.6 及以下)索引都是按升序实现的。

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

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

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

    【讨论】:

    • 谢谢,听起来很有道理:)
    猜你喜欢
    • 2011-09-29
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多