当前位置: 首页 > 知识库问答 >
问题:

复合唯一键在MySQL中有索引吗?-数据库管理系统

杨利
2023-03-14

我有一个userskills表,它有三列:id(PK)、userid(FK)和skillid(FK)。

我想对useridskillid的组合强制执行复合唯一性约束。为了更快的查找,我希望对(userId,skillId)进行复合索引。

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

对于正常的多列索引,根据MySQL参考手册,

如果表有一个多列索引,那么优化器可以使用索引最左边的任何前缀来查找行。例如,如果在(col1,col2,col3)上有三列索引,则在(col1)、(col1,col2)和(col1,col2,col3)上有索引搜索功能

简单地说,我想知道在声明了前面提到的涉及它们的多列唯一约束之后,我是否应该创建一个多列索引(userId,skillId),或者这只是多余的,因此是不需要的。

共有2个答案

国斌斌
2023-03-14

问:想知道MySQL是否也索引复合唯一键。如果是,是否将其视为正常的多列索引

是的,参见:

MySQL要求对外键列进行索引;如果创建具有外键约束但给定列上没有索引的表,则创建索引。异常:NDB群集需要外键列上的显式唯一键(或主键)。

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

FloridaDBA评论说:

只需在这两个字段上添加唯一索引。在table_name上创建唯一索引index_name(index_column_1,index_column_2,...)

这是可能的,但我不会建议“仅仅”这样做,因为像手册中所说的那样。

优化器可以使用索引最左边的任何前缀来查找行

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

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

有关这方面的更多信息,请阅读本文并研究给定的示例。

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

夹谷辰沛
2023-03-14

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

您仍然需要在(userId,skillId)上添加一个唯一索引。

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

 类似资料:
  • 问题内容: 我想知道Elasticsearch是否需要先定义复合索引。通过复合索引,我的意思是像mongodb一样。 db.collection.ensureIndex({field1:1,field2:1,field3:1}) 或类似mysql db的东西。 在mytable(field1,field2,field3)上创建索引adhoc_index; 所以我要处理的数据非常平坦(大多数只是cs

  • 我想知道elasticsearch是否需要定义一个优先级的复合索引。通过复合索引,我的意思是像mongoDB一样的东西。 db.collection.ensure索引 或者类似mysql db的功能。 在mytable上创建索引adhoc_index(field 1, field 2, field 3); 因此,我处理的数据非常简单(大部分只是csv格式)。为完整起见,如下所示。 字段1,字段2。

  • 数据库创建索引能够大大提高系统的性能。 第一,通过创建唯一性的索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快数据的检索速度,这也使创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序子句进行数据检索时,同样可以显著的减少查询中查询中分组和排序的时间。 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,

  • 基本概念 在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象。 索引可以避免全表扫描。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页。 对于非聚集索引,有些查询甚至可以不访问数据页。 聚集索引可以避免数据插入操作集中于表的最后一个数据页。 一些情况下,索引还可用于避免排序操作。 索引的存储 一条索引记录中包含的

  • 问题内容: 我认为外键意味着单行必须引用单行,但是我正在查看某些表,但事实并非如此。表1在表2的列2上有一个具有外键约束的列1,但是在表2中有很多记录在列2中具有相同的值。在column2上也有非唯一索引。这是什么意思?外键约束是否仅表示至少一条记录必须存在,且在正确的列中具有正确的值?我认为这意味着必须有一个这样的记录(不确定空值是否适合图片,但目前我对此不太担心)。 更新:显然,此行为特定于M

  • 1.4.1. MySQL的历史 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。MySQL AB是由多名MySQL开发人创办的一家商业公司。它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业