【问题标题】:Does the order of index creation matter索引创建的顺序是否重要
【发布时间】:2017-07-14 20:55:01
【问题描述】:

假设我在 (x,y) 索引的 foo 表的两列上有一个索引

如果我将其搜索为 select * from foo where x=1 and y=2select * from foo where y=2 and x=1。在 mysql 上真的很重要吗?

【问题讨论】:

  • 一般来说,在 SQL(任何变体)中,你是在告诉引擎你想要什么不是 怎么做。优化器的工作是找出如何最好地执行这项工作。由于您的两个查询之间没有逻辑差异,因此它们最终应该得到相同的优化。

标签: mysql optimization indexing


【解决方案1】:

简短的回答 - 不,没关系。 MySQL 将尝试选择要使用的最佳索引,无论该列在您的 WHERE 子句中出现在第一个还是第二个。

您可以通过对每个语句运行 EXPLAIN 语句来证明这一点,以获取有关 how MySQL will execute the query 的更多信息 - 它应该表明在两种情况下都使用了相同的索引。


如果您正在讨论列在索引中出现的顺序 - (x,y)(y,x),在这种情况下也没有关系,因为您选择同时使用这两个列。但是,如果您有时只选择其中一列,则该列应首先出现在索引中,以便 MySQL 可以在仅提供一个值时使用部分索引来帮助优化查询。

【讨论】:

    【解决方案2】:

    这在 Postgre 上对某些查询进行优化查询非常有用,但 MySQL 只是忽略索引顺序(ASC、DESC)我不知道哪个版本会支持这个。

    “我认为”这是一个工作台错误,但 wockbench 团队告诉我:

    我们的手册,http://dev.mysql.com/doc/refman/5.5/en/create-index.html, 说:

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

    所以,这可能就是您在 Workbench 中看到的原因:它 允许添加 DESC 选项,但服务器本身会忽略它。

    早期的cmets可以在http://bugs.mysql.com/65893查看

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 2018-06-01
      • 2014-08-10
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 2019-05-28
      相关资源
      最近更新 更多