在MySQL中有两个单列索引与一个两列索引?

我面对以下,我不知道什么是最好的做法。

考虑下面的表(它会变大):

ID PK | giver_id FK | recipient_id FK | date

我使用InnoDB,据我所知,它为两个外键列自动创build索引。 但是,我也会做很多的查询,我需要匹配一个特定的组合:

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

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

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

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

如果您有两列的索引,查询可能会更快(您应该测量)。 双列索引也可以用作单列索引,但仅限于列出的列。

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

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

覆盖指数如下:

 ALTER TABLE your_table ADD INDEX (giver_id, recipient_id); 

…意味着如果查询引用了giver_idgiver_idrecipient_id的组合,则可以使用该索引。 请注意,索引标准是最基础的 – 仅涉及到recipient_id的查询将无法在我提供的语句中使用覆盖索引。

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

如果其中一个外键索引已经非常有select性,那么数据库引擎应该使用那个指定的查询。 大多数数据库引擎都使用某种启发式方法来select最佳索引。 如果两个索引本身都不具有高度的select性,那么添加构build在两个键上的索引可能是有意义的,因为你说你会使用这种types的查询。

另外要考虑的是,如果您可以消除此表中的PK字段,并在giver_idrecipient_id字段中定义主键索引。 你说这个组合是独一无二的,所以这可能会起作用(考虑到许多其他的条件,只有你可以回答)。 通常情况下,我认为增加的额外复杂性是不值得的麻烦。

另外需要考虑的是两种方法的性能特征将基于数据集的大小和基数。 您可能会发现,2列索引仅在某个数据集大小阈值时才会注意到更高性能,或者恰恰相反。 没有什么可以替代您的确切场景的性能指标。