This描述了不同的索引:
KEY或INDEX是指正常的非唯一索引。非独特的价值观 对于索引是允许的,因此索引可能包含行 索引的所有列中的相同值。这些索引没有 对您的数据施加任何限制,以便它们仅用于制作 确保某些查询可以快速运行。
UNIQUE是指索引的所有行必须唯一的索引。 也就是说,同一行可能不具有相同的非NULL值 此索引中的列为另一行。以及习惯速度 查询,UNIQUE索引可用于强制限制数据, 因为数据库系统不允许这个不同的值规则 在插入或更新数据时被破坏。
我理解应用程序逻辑的好处(您不希望进行唯一性检查)但是还有性能改进吗?具体来说,使用INDEX而不是UNIQUE写入的速度要快多少?
答案 0 :(得分:3)
UNIQUE KEY
是一个约束,当您想强制执行该约束时,可以使用它。
KEY
是一个索引,您可以选择使某些查询更有效。
使用任一类型的索引插入表中的性能几乎相同。也就是说,差异(如果有的话)是如此之小,以至于为了表现而不值得挑选另一个。
选择支持约束的索引类型。当且仅当您要强制执行唯一性时,才使用UNIQUE KEY
。否则请使用KEY
。
你的问题就像问,“哪个更快,摩托车还是快艇?”它们用于不同的情况,所以判断它们的速度并非重要。
答案 1 :(得分:1)
插入强>
插入行时,会立即检查所有唯一键(PRIMARY
和UNIQUE
)的重复键。这样,如果有必要,您会在INSERT
上收到错误。非唯一INDEXes
的更新被延迟(有关讨论,请参阅“更改缓冲”)。该工作将在后台完成,因此INSERT
将不会等待它。
因此,插入UNIQUE
会有轻微的开销。但是,正如已经指出的那样,如果您需要唯一性约束,那么使用它。
选择强>
可以使用任何类型的索引(PRIMARY
,UNIQUE
或INDEX
) 来加速SELECT
。大多数情况下,索引的类型相同。但是对于PRIMARY
和UNIQUE
,优化器可以知道只有一个(或可能为零)行匹配给定值,因此它可以获取一行,然后退出。对于非唯一索引,可能有多行,因此它会持续扫描索引,检查更多行。 在第一个不匹配的行上查看后,此扫描将停止。因此,非唯一索引与唯一索引的开销很小(非常小)。
底线
性能问题不如语义重要(唯一性约束与否)。