MySQL 5.0索引 - 唯一与非唯一

时间:2008-12-23 14:27:27

标签: mysql indexing

在性能方面,MySQL唯一索引和非唯一索引之间有什么区别?

让我们说我想在2列的组合上创建索引,并且组合是唯一的,但我创建了一个非唯一索引。这会对MySQL使用的性能或内存产生重大影响吗?

同样的问题,主要密钥和唯一索引之间是否存在差异?

2 个答案:

答案 0 :(得分:124)

UNIQUE和PRIMARY KEY是约束,而不是索引。尽管大多数数据库都使用索引来实现这些约束。除了索引之外,约束的额外开销是微不足道的,尤其是当您计算跟踪和纠正无意的重复时(无论是否发生)的成本。

如果您具有较高的选择性,则索引通常会更有效。这是不同值的数量与总行数的比率。

例如,在社会保险号的列中,您可能有100万行,其中包含100万个不同的值。所以选择性是1000000/1000000 = 1.0(尽管有罕见的历史例外,SSN的目的是唯一的。)

但该表中的另一栏“性别”可能只有两个不同的值超过100万行。 2/1000000 =选择性非常低。

具有UNIQUE或PRIMARY KEY约束的索引保证选择性为1.0,因此它始终与索引一样有效。

您询问了主键和唯一约束之间的区别。主要是,每个表只能有一个主键约束(即使该约束的定义包含多个列),而您可以有多个唯一约束。具有唯一约束的列可能允许NULL,而主键约束中的列不允许NULL。否则,主键和唯一键的实现和使用非常相似。

您在评论中询问是否使用MyISAM或InnoDB。在MySQL中,他们使用术语存储引擎。这两个存储引擎之间存在着许多微妙的差异,但主要的是:

  • InnoDB支持事务,因此您可以选择回滚或提交更改。 MyISAM实际上总是自动提交。
  • InnoDB强制执行外键约束。 MyISAM不强制执行甚至存储外键约束。

如果这些功能是您在应用程序中需要的功能,那么您应该使用InnoDB。


要回复您的评论,就不那么简单了。在很多情况下,InnoDB实际上比MyISAM更快,因此它取决于您的应用程序的选择,更新,并发查询,索引,缓冲区配置等的组合。

有关存储引擎的详细性能比较,请参阅http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/。 InnoDB经常胜过MyISAM,显然不可能说一个比另一个快。

与大多数与性能相关的问题一样,为应用程序回答的唯一方法是使用您的应用程序和代表性数据样本测试这两种配置,并测量结果。

答案 1 :(得分:2)

在一个恰好是唯一的非唯一索引和唯一索引?我不确定,但我猜的不是很多。优化器应该检查索引的基数并使用它(对于唯一索引,它将始终是行数)。

就主键而言,可能相当多,但这取决于您使用的引擎。

InnoDB引擎(许多人使用)总是在主键上聚集行。这意味着PK基本上与实际的行数据相结合。如果您通过PK(或实际上是范围扫描等)进行大量查找,这是一件好事,因为这意味着它不需要从光盘中获取尽可能多的块。

永远不会在InnoDB中聚集非PK唯一索引。

另一方面,其他一些引擎(特别是MyISAM)不会对PK进行聚类,因此主键就像普通的唯一索引一样。