MySql唯一索引vs.索引速度

17
在MySQL中,除了数据完整性外,使用唯一索引是否有任何性能优势?(假设数据是唯一的)
例如,相比普通索引,创建、更新或查询唯一索引是否需要更少的时间?

你可以考虑以下几点: https://dev59.com/ZnM_5IYBdhLWcg3wp0wX - AntonBerezin
1个回答

23
查询优化器可以比普通索引更有效地使用唯一索引处理某些查询。比如,在一个包括唯一索引的所有列的SELECT DISTINCT查询中,查询优化器可以生成跳过对结果进行排序和去重的计划,即使计划没有明确使用该索引!
总体而言,唯一索引与非唯一索引在相同列上对查询性能的影响取决于您的查询语句。
我的建议是尽可能准确地建模您的数据。如果您的数据具有这样的特征,即某些列的组合不会在不同行中重复出现,并且您打算为这些列创建索引,则应该创建唯一索引。
实际上,在这种情况下,即使您本来不打算为其创建索引,考虑使用唯一索引来强制这些列的唯一性。添加索引确实会稍微增加插入、删除和一些更新操作的开销,但除非这些操作的性能不令人满意,否则最好忽略它们。

1
是的,@Anthony,这就是“唯一索引”中“唯一”的含义。而“索引”部分意味着数据库维护额外的信息,以帮助它快速将索引列的值与其对应的行关联起来。 - John Bollinger
1
@Anthony,索引通常在它们能够支持您的WHERE条件和/或连接谓词时最有效。尽管有时索引可以通过覆盖所选所有列来提供一些优势,但那很少是选择定义哪些索引的好策略。请记住,通常每个查询表只会使用一个索引。还要记住许多因素影响查询性能,因此您需要测试,有时进行微调。 - John Bollinger
5
这是一篇写得很好的回答,但“这要看情况”是一个非常含糊的答案。 - Qubei
3
“除非你生活在岩石下面”,“这取决于”是任何好回答中最真实的观点。因为一切都是相对的,正确的解决方案始终取决于每个人特定问题的情况。 - Sir Rogers
1
@JohnBollinger据我测试,使用唯一索引val1,val2解释select distinct concat(val1, val2)与非唯一索引val1,val2显示完全相同的结果。因此,唯一索引仅用于强制数据唯一性,或者我的查询不会获得更好的性能… - Anubioz
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接