多列索引中唯一的第一列
Unique first column in multi-column index
我有 2 列的多列索引。我可以在不为第一列创建单独索引的情况下使第一列唯一吗?
如果我没理解错的话mysql只能使用这个索引中的第一列进行查找,那么它可以用它来检测唯一性吗?
你问了。
I have multi-column index for 2 columns. Can I make first column unique without making separate index for that?
答案是否定的。您需要在第一列上使用单独的唯一索引来实施唯一性约束。
简短的回答是“否”。因为意义不大。
事实上,MySQL 能够将多列索引用于仅使用索引定义中最左边“n”列的操作。
假设您在列 (col1, col2)
上有一个索引。 MySQL 可以使用它来查找在 col1
和 col2
、GROUP BY col1, col2
或 ORDER BY col1, col2
上都符合条件的记录。重要的是要注意 col1
和 col2
需要在 GROUP BY
或 ORDER BY
子句中按此顺序使用。它们的顺序在 WHERE
或 ON
子句上无关紧要,只要两者都被使用。
MySQL 也可以对 WHERE
或 ON
条件和仅包含 col1
的 GROUP BY
或 ORDER BY
子句使用相同的索引.但是,如果 col2
出现而没有 col1
.
,则它不能使用索引
当您在列 (col1, col2)
上有一个索引并且所有行在列 col1
中都有不同的值时会发生什么?
假设我们有一个 table,它在列 col1
中有不同的值,并且它在列 (col1, col2)
上有一个索引。当 MySQL 需要查找匹配 WHERE col1 = val1 AND col2 = val2
的行时,通过查询索引可以找到具有 col1 = val1
的行。它不需要使用索引来细化候选行列表,因为没有列表:最多只有一行具有 col1 = val1
.
当然,大多数时候 MySQL 将 使用索引来检查是否 col2 = val2
但在该索引中包含 col2
不会'为索引带来更多有用的信息。它占用的存储 space 和它在 table 数据更新上使用的处理能力对于它添加到行搜索的微小贡献来说太大了。
多列索引的全部目的是在多列索引中包含的列不能单独使用时通过缩小给定值集的匹配行列表来帮助搜索,因为它们不包含足够多的不同值。
从技术上讲,无法告诉 MySQL 您想要在 (col1, col2)
上创建一个多列索引,而该索引在 col1
上必须具有唯一值。而是在 col1
上创建一个 UNIQUE INDEX
。然后考虑 table 中的数据以及 运行 对其进行的查询,并确定 col2
上的另一个索引是否不比 [= 上的多列索引更好10=].
为了决定您可以创建新索引(UNIQUE
on col1
,INDEX
on col2
),将 EXPLAIN
放在前面您 运行 在 table 上最频繁的查询,并检查哪个索引将选择 MySQL 供使用。
您需要在 table 中有足够的数据(至少数千行,越多越好)才能获得准确的结果。
我有 2 列的多列索引。我可以在不为第一列创建单独索引的情况下使第一列唯一吗?
如果我没理解错的话mysql只能使用这个索引中的第一列进行查找,那么它可以用它来检测唯一性吗?
你问了。
I have multi-column index for 2 columns. Can I make first column unique without making separate index for that?
答案是否定的。您需要在第一列上使用单独的唯一索引来实施唯一性约束。
简短的回答是“否”。因为意义不大。
事实上,MySQL 能够将多列索引用于仅使用索引定义中最左边“n”列的操作。
假设您在列 (col1, col2)
上有一个索引。 MySQL 可以使用它来查找在 col1
和 col2
、GROUP BY col1, col2
或 ORDER BY col1, col2
上都符合条件的记录。重要的是要注意 col1
和 col2
需要在 GROUP BY
或 ORDER BY
子句中按此顺序使用。它们的顺序在 WHERE
或 ON
子句上无关紧要,只要两者都被使用。
MySQL 也可以对 WHERE
或 ON
条件和仅包含 col1
的 GROUP BY
或 ORDER BY
子句使用相同的索引.但是,如果 col2
出现而没有 col1
.
当您在列 (col1, col2)
上有一个索引并且所有行在列 col1
中都有不同的值时会发生什么?
假设我们有一个 table,它在列 col1
中有不同的值,并且它在列 (col1, col2)
上有一个索引。当 MySQL 需要查找匹配 WHERE col1 = val1 AND col2 = val2
的行时,通过查询索引可以找到具有 col1 = val1
的行。它不需要使用索引来细化候选行列表,因为没有列表:最多只有一行具有 col1 = val1
.
当然,大多数时候 MySQL 将 使用索引来检查是否 col2 = val2
但在该索引中包含 col2
不会'为索引带来更多有用的信息。它占用的存储 space 和它在 table 数据更新上使用的处理能力对于它添加到行搜索的微小贡献来说太大了。
多列索引的全部目的是在多列索引中包含的列不能单独使用时通过缩小给定值集的匹配行列表来帮助搜索,因为它们不包含足够多的不同值。
从技术上讲,无法告诉 MySQL 您想要在 (col1, col2)
上创建一个多列索引,而该索引在 col1
上必须具有唯一值。而是在 col1
上创建一个 UNIQUE INDEX
。然后考虑 table 中的数据以及 运行 对其进行的查询,并确定 col2
上的另一个索引是否不比 [= 上的多列索引更好10=].
为了决定您可以创建新索引(UNIQUE
on col1
,INDEX
on col2
),将 EXPLAIN
放在前面您 运行 在 table 上最频繁的查询,并检查哪个索引将选择 MySQL 供使用。
您需要在 table 中有足够的数据(至少数千行,越多越好)才能获得准确的结果。