MySQL 中是否索引了复合唯一键?

Are composite unique keys indexed in MySQL?

我有一个 UserSkills table 有三列: id (PK), userId (FK)skillId (FK).

我想对 userIdskillId 的组合实施复合唯一约束。为了更快地查找,我希望在 (userId, skillId).

上进行复合索引

据我所知,MySQL 自动索引唯一列。但是,到目前为止,我看到的所有示例和我自己的实现都涉及单列唯一约束。我想知道 MySQL 是否也索引复合唯一键。如果是,是否将其视为普通的多列索引?

对于普通的多列索引,根据MySQL参考手册:

If the table has a multiple-column index, any leftmost prefix of the index can be used by the optimizer to look up rows. For example, if you have a three-column index on (col1, col2, col3), you have indexed search capabilities on (col1), (col1, col2), and (col1, col2, col3).

简而言之,我想知道是否应该在声明上述涉及它们的多列唯一约束后创建一个 (userId, skillId) 的多列索引,或者这只是多余的,因此不是需要吗?

问:want to know if MySQL indexes composite unique keys as well. And if it does, is it treated as a normal multi-column index or not

是的,请参阅:

MySQL requires that foreign key columns be indexed; if you create a table with a foreign key constraint but no index on a given column, an index is created. Exception: NDB Cluster requires an explicit unique key (or primary key) on the foreign key column.

https://dev.mysql.com/doc/refman/5.6/en/constraint-foreign-key.html

FloridaDBA 评论:

Just add a unique index on the two fields. CREATE UNIQUE INDEX index_name ON table_name(index_column_1,index_column_2,...)

这是可能的,但我不建议 "just" 这样做,因为手册上是这么说的。

any leftmost prefix of the index can be used by the optimizer to look up rows

这取决于您的查询是如何构建的以及您是如何实现索引的,但是是否有可能看到性能下降,因为它不能总是使用复合索引。

要了解复合索引是否是一个好主意,您必须研究所有使用表的查询并检查 WHERE 子句之类的东西如何使用这些列。重构其他查询(如果有的话)可能有助于优化组合键的使用。

有关此内容的更多信息,请阅读本文并研究给定的示例。

https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html

因此对于您的字段,id (PK)、userId (FK) 和 skillId (FK), mysql 将自动在 (id)(唯一)上创建索引,在 (userId)(非唯一)上创建索引,在 (skillId)(非唯一)上创建索引。

您仍然需要 (userId, skillId) 上的额外唯一索引。

这可以替换 (userId) 上的非唯一索引,因为优化器可以在需要通过 userId 查找时使用 (userId, skillId) 索引。但是,当 mysql 中的外键使用索引时创建和删除索引可能很麻烦,因此您可能只想添加复合唯一索引。