两个单列索引与MySQL中的一个双列索引?

Tom*_*Tom 100 mysql sql database indexing performance

我面临以下问题,我不确定最佳做法是什么.

考虑下表(会变大):

id PK | giver_id FK | recipient_id FK | 日期

我正在使用InnoDB,根据我的理解,它会自动为两个外键列创建索引.但是,我还要做很多查询,我需要匹配以下特定组合:

SELECT...WHERE giver_id = x AND recipient_id = t.

每个这样的组合在表中都是唯一的.

在这些列上添加两列索引是否有任何好处,或理论上两个单独的索引是否足够/相同?

Mar*_*ers 116

如果您有两个单列索引,则在您的示例中将只使用其中一个索引.

如果您有一个包含两列的索引,则查询可能会更快(您应该测量).两列索引也可以用作单列索引,但仅适用于首先列出的列.

有时在(A,B)上有索引而在(B)上有另一个索引.这使得查询快速使用其中一个或两个列,但当然也使用更多的磁盘空间.

选择索引时,还需要考虑插入,删除和更新的影响.更多索引=更新速度更慢.

  • “MySQL 可以将多列索引用于测试索引中所有列的查询,或者只测试第一列、前两列、前三列等的查询。如果在右侧指定列索引定义中的顺序,单个复合索引可以加快同一张表上的几种查询速度。” - [多列索引](https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html) (2认同)

OMG*_*ies 27

覆盖指数如:

ALTER TABLE your_table ADD INDEX (giver_id, recipient_id);
Run Code Online (Sandbox Code Playgroud)

...将意味着如果查询中提到的索引可以使用giver_id,或组合giver_idrecipient_id.请注意,索引标准是最基础的 - 只是recipient_id在我提供的语句中不能使用覆盖索引的查询.

此外,MySQL每个SELECT只能使用一个索引,因此覆盖索引将是优化查询的最佳方法.

  • "MySQL每个SELECT只能使用一个索引",这不再适用,如果您编辑了要更新的答案,那就太好了. (9认同)
  • @IvoPereira MySQL中的多列索引允许您从左到右使用索引中的所有字段.例如,如果你有一个`INDEX(col1,col2,col3,col4)`那么索引将应用于带有`WHERE`子句的搜索,如`col1 ='A'`或`col1 ='A'和col2 = 'B'`或`col1 ='A'AND col2 ='B'AND col3 ='C'AND col4 ='D'`,但这个特殊的索引不会用于`WHERE col2 ='B'之类的东西`或`WHERE col3 ='C'和col4 ='D'`因为搜索字段在索引定义中不是最左边的.您必须添加其他索引才能涵盖这些字段. (2认同)