让我们看一下下面的 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;
我在此表上进行的唯一查找将是:
哪里国家代码=? AND 产品 ID = ?
哪里国家代码=?和产品 ID = ? AND 商家 ID = ?
因此索引可以用于所有查询,这很好。
并非所有查询都会包含 merchantId
,因此最好将其用作复合索引中的最后一列。
现在关于前两列:我永远不会单独查找 countryCode
或 productId
单独查找,所以乍一看我会我敢打赌,使用索引列顺序 (countryCode, ProductId,merchantId)
或 (productId,countryCode,merchantId)
不会对我的用例在性能方面产生任何影响,但我没有理论知识来支持这一点。
鉴于 productId
比 countryCode
有更多不同,是否存在任何性能差异(不仅仅是 SELECT
,还有INSERT
、UPDATE
和DELETE
速度)来改变这两列在索引中的顺序,当它们总是一起使用时?
最佳答案
鉴于条件项全部相等,并且这些项通过 AND
组合,因此更改索引中列的顺序在性能上没有显着差异。
想想电话簿。如果我让你查找“史密斯,约翰”,你会查找史密斯部分,然后在其中找到约翰。如果这本书的组织方式不同,先按名字,然后按姓氏,您会查找约翰部分,然后在其中找到史密斯。无论哪种方式,您都可以轻松缩小搜索范围。
有什么区别吗?可能略有不同,但还不足以令人担心。
如果您的条件不等于,则规则会发生变化。首先将等式比较中的列放入索引中,然后将一列放入范围或不等式条件中。
您可能也喜欢我的演示,How to Design Indexes, Really 。这里还有我演讲的视频:https://www.youtube.com/watch?v=ELR7-RdU9XU
关于mysql - 复合索引中列的顺序会影响查找速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27130966/