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

我面临着以下问题,我不知道什么是最佳实践。

考虑下表(它将变得很大) :

日期

我使用的是 InnoDB,据我所知,它会自动为两个外键列创建索引。然而,我也会在需要匹配以下特定组合的地方进行大量查询:

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

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

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

77401 次浏览

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

如果您有一个包含两列的索引,那么查询可能会更快(您应该度量)。两列索引也可以用作单列索引,但只能用于首先列出的列。

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

在选择索引时,还需要考虑对插入、删除和更新的影响。更多的索引 = 更慢的更新。

覆盖指数如下:

ALTER TABLE your_table ADD INDEX (giver_id, recipient_id);

... 将意味着如果查询引用 giver_id,或 giver_idrecipient_id的组合,则可以使用索引。请注意,索引条件是最左边的——只引用 recipient_id的查询将不能使用我提供的语句中的覆盖索引。

请注意,一些旧版本的 MySQL 每个 SELECT 只能使用一个索引,因此覆盖索引将是优化查询的最佳方法。

如果其中一个外键索引已经具有很强的选择性,那么数据库引擎应该将该索引用于指定的查询。大多数数据库引擎使用某种启发式方法,以便能够在这种情况下选择最佳索引。如果这两个索引本身都没有高度的选择性,那么添加构建在这两个键上的索引可能是有意义的,因为您说您将经常使用这种类型的查询。

另一件需要考虑的事情是,是否可以删除该表中的 PK 字段,并在 giver_idrecipient_id字段上定义主键索引。你说过这种组合是独一无二的,所以它可能会起作用(考虑到许多其他条件,只有你能回答)。不过,通常我认为增加的复杂性不值得这么麻烦。

另一件需要考虑的事情是,这两种方法的性能特征将基于数据集的大小和基数。您可能会发现,只有在特定的数据集大小阈值下,两列索引才会变得更有性能,或者恰恰相反。对于您的确切场景,没有什么能够替代性能指标。