多列索引中唯一的第一列

时间:2015-02-25 12:24:23

标签: mysql indexing constraints

我有2列的多列索引。我可以将第一列唯一而不为其制作单独的索引吗?

如果我理解正确,mysql只能使用此索引中的第一列进行查找,那么它可以用它来检测唯一性吗?

2 个答案:

答案 0 :(得分:2)

简短的回答是“不”。因为它没有多大意义。

实际上,MySQL能够将多列索引用于仅使用索引定义中最左边的“n”列的操作。

假设您有列(col1, col2)的索引。 MySQL可以使用它来查找匹配col1col2GROUP BY col1, col2ORDER BY col1, col2条件的记录。请注意,col1col2条款中需要按此顺序使用GROUP BYORDER BY。只要两者都使用,他们的顺序与WHEREON条款无关。

MySQL也可以对WHEREON条件以及仅包含GROUP BY的{​​{1}}或ORDER BY子句使用相同的索引。但是,如果col1没有col2,则无法使用索引。

当列col1上有索引并且所有行在列(col1, col2)中都有不同的值时会发生什么?

假设我们有一个表在列col1中具有不同的值,并且在列col1上有一个索引。当MySQL需要查找与(col1, col2)匹配的行时,通过查询索引,它可以找到具有WHERE col1 = val1 AND col2 = val2的行。它不需要使用索引来优化候选行列表,因为没有列表:最多有一行有col1 = val1

当然,大多数情况下MySQL 使用索引来检查col1 = val1是否col2 = val2但在此索引中有col2不会为索引带来更多有用信息。它所占用的存储空间以及它用于表数据更新的处理能力对于它为行搜索添加的微小贡献来说太大了。

在多列上建立索引的全部目的是,当多列索引中包含的列不能单独使用时,通过缩小给定值集的匹配行列表来帮助搜索,因为它们不够单独使用不同的价值观。

从技术上讲,没有办法告诉MySQL你想在(col1, col2)上拥有一个必须在col1上具有唯一值的多列索引。改为在col1上创建UNIQUE INDEX。然后考虑表中的数据以及针对它运行的查询,并确定col2上的另一个索引是否仅优于(col1, col2)上的多列索引。

为了决定您可以在UNIQUE col1INDEX创建新索引(col2),请将EXPLAIN放在最前面您在桌面上运行的频繁查询,并检查哪些索引将选择使用MySQL。

您需要在表格中获得足够的数据(数千行,至少更多,更好),以获得准确的结果。

答案 1 :(得分:0)

你问。

  

我有2列的多列索引。我可以将第一列唯一而不为其制作单独的索引吗?

答案是否定的。您需要在第一列上使用单独的唯一索引来强制执行唯一性约束。