使用INDEX而不是唯一索引是否有提高写入性能?

时间:2018-03-02 16:04:34

标签: mysql indexing

This描述了不同的索引:

  

KEY或INDEX是指正常的非唯一索引。非独特的价值观   对于索引是允许的,因此索引可能包含行   索引的所有列中的相同值。这些索引没有   对您的数据施加任何限制,以便它们仅用于制作   确保某些查询可以快速运行。

     

UNIQUE是指索引的所有行必须唯一的索引。   也就是说,同一行可能不具有相同的非NULL值   此索引中的列为另一行。以及习惯速度   查询,UNIQUE索引可用于强制限制数据,   因为数据库系统不允许这个不同的值规则   在插入或更新数据时被破坏。

我理解应用程序逻辑的好处(您不希望进行唯一性检查)但是还有性能改进吗?具体来说,使用INDEX而不是UNIQUE写入的速度要快多少?

2 个答案:

答案 0 :(得分:3)

UNIQUE KEY是一个约束,当您想强制执行该约束时,可以使用它。

KEY是一个索引,您可以选择使某些查询更有效。

使用任一类型的索引插入表中的性能几乎相同。也就是说,差异(如果有的话)是如此之小,以至于为了表现而不值得挑选另一个。

选择支持约束的索引类型。当且仅当您要强制执行唯一性时,才使用UNIQUE KEY。否则请使用KEY

你的问题就像问,“哪个更快,摩托车还是快艇?”它们用于不同的情况,所以判断它们的速度并非重要。

答案 1 :(得分:1)

插入

插入行时,会立即检查所有唯一键(PRIMARYUNIQUE)的重复键。这样,如果有必要,您会在INSERT上收到错误。非唯一INDEXes的更新被延迟(有关讨论,请参阅“更改缓冲”)。该工作将在后台完成,因此INSERT将不会等待它。

因此,插入UNIQUE会有轻微的开销。但是,正如已经指出的那样,如果您需要唯一性约束,那么使用它

选择

可以使用任何类型的索引(PRIMARYUNIQUEINDEX 来加速SELECT。大多数情况下,索引的类型相同。但是对于PRIMARYUNIQUE,优化器可以知道只有一个(或可能为零)行匹配给定值,因此它可以获取一行,然后退出。对于非唯一索引,可能有多行,因此它会持续扫描索引,检查更多行。 在第一个不匹配的行上查看后,此扫描将停止。因此,非唯一索引与唯一索引的开销很小(非常小)。

底线

性能问题不如语义重要(唯一性约束与否)。