【问题标题】:Does the order of columns in a composite index affect lookup speed?复合索引中列的顺序会影响查找速度吗?
【发布时间】:2014-11-25 15:44:12
【问题描述】:

让我们看看下面的 MySQL 表:

CREATE TABLE prices (
  id          INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  countryCode CHAR(2) COLLATE ASCII_BIN NOT NULL,
  productId   INT(10) UNSIGNED NOT NULL,
  merchantId  INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (id),
  INDEX (countryCode, productId, merchantId)
) ENGINE=InnoDB;

我将在此表上进行的唯一查找将是:

  • WHERE countryCode = ? AND productId = ?
  • WHERE countryCode = ? AND productId = ? AND merchantId = ?

因此索引可以用于所有查询,这很好。

并非所有查询都包含merchantId,因此最好将其用作复合索引中的最后一列。

现在关于前两列:我永远不会单独查找 countryCode 或单独查找 productId,所以乍一看,我敢打赌使用索引列顺序 (countryCode, productId, merchantId)(productId, countryCode, merchantId) 在性能方面对我的用例没有任何影响,但我没有理论知识来支持这一点。

鉴于productIds 比countryCodes 更多不同,是否有任何性能差异(不仅SELECT,还有INSERTUPDATEDELETE 速度) 来改变索引中这两列的顺序,当它们总是一起使用时?

【问题讨论】:

    标签: mysql performance indexing


    【解决方案1】:

    鉴于条件项全部相等,并且条件项与AND 组合,更改索引中列的顺序在性能上没有显着差异。

    想想电话簿。如果我让您查找“Smith, John”,您可以查找 Smith 部分,然后在其中找到 John。如果这本书的组织方式不同,按名字然后按姓氏,您会查找 John 部分,然后在其中找到 Smith。无论哪种方式,您都可以很容易地缩小搜索范围。

    有区别吗?可能略有不同,但还不足以担心。

    如果你有条件等于,那么规则就会改变。将相等比较中的列首先放入索引中,然后将一列放入范围或不等式条件中。

    您可能还喜欢我的演示文稿How to Design Indexes, Really。还有一段我在这里发表演讲的视频:https://www.youtube.com/watch?v=ELR7-RdU9XU

    【讨论】:

      【解决方案2】:

      你的直觉是正确的。只要您的连接是等连接(使用=),那么您提到的两个索引中的任何一个都应该用于查询。 MerchantId 需要是其他两个之后的第三个键。

      可能存在一些极端情况,键很长,CountryCodeProductId 之间的排序会有所不同——比较长字符串比比较整数需要更长的时间。这些与您的数据结构无关。

      MySQL 在查询中使用复合索引实际上有很好的documentation

      【讨论】:

        猜你喜欢
        • 2021-07-01
        • 2015-05-31
        • 2014-06-05
        • 1970-01-01
        • 2011-11-14
        • 2020-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多