MySQL 中是否索引了复合唯一键?
Are composite unique keys indexed in MySQL?
我有一个 UserSkills
table 有三列: id
(PK), userId
(FK) 和 skillId
(FK).
我想对 userId
和 skillId
的组合实施复合唯一约束。为了更快地查找,我希望在 (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 中的外键使用索引时创建和删除索引可能很麻烦,因此您可能只想添加复合唯一索引。
我有一个 UserSkills
table 有三列: id
(PK), userId
(FK) 和 skillId
(FK).
我想对 userId
和 skillId
的组合实施复合唯一约束。为了更快地查找,我希望在 (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 中的外键使用索引时创建和删除索引可能很麻烦,因此您可能只想添加复合唯一索引。