mysql - 复合索引中列的顺序会影响查找速度吗?

标签 mysql performance indexing

让我们看一下下面的 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,因此最好将其用作复合索引中的最后一列。

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

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

最佳答案

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

想想电话簿。如果我让你查找“史密斯,约翰”,你会查找史密斯部分,然后在其中找到约翰。如果这本书的组织方式不同,先按名字,然后按姓氏,您会查找约翰部分,然后在其中找到史密斯。无论哪种方式,您都可以轻松缩小搜索范围。

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

如果您的条件等于,则规则会发生变化。首先将等式比较中的列放入索引中,然后将一列放入范围或不等式条件中。

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

关于mysql - 复合索引中列的顺序会影响查找速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27130966/

相关文章:

java跨网络连接mysql

database - 用户信息和登录凭据的表设计?

c++ - 减少 C++ 代码中的循环次数是否有助于提高速度?

javascript - 快速缩小图像?

sql - oracle中列的一部分的索引?

mysql - 缓慢的 MySQL 插入

mysql - 索引在 mysql 内部是如何工作的?

mysql - 将存储为行的名称值对转换为列

php - 这个 MySQL 查询有什么问题吗?

mysql - 从硬编码列表 MySql 中查询