MySQL 5.0索引 – 唯一与非唯一

在性能方面,mysql唯一索引与非唯一索引有什么区别? 让我们说我想要在2列的组合索引,组合是唯一的,但我创build一个非唯一索引。 这会对性能或mysql使用的内存有什么显着的影响吗? 同样的问题,主键和唯一索引是否有区别。

UNIQUE和PRIMARY KEY是约束条件 ,而不是索引。 尽pipe大多数数据库通过使用索引来实现这些约束。 除了索引之外,约束的额外开销也是微不足道的,尤其是当您计算追踪并纠正意外重复时的成本(如果不是)。

如果你有很高的select性,索引通常会更有效。 这是不同值的数量与总行数的比率。

例如,在社会安全号码列中,您可能有100万行,其中有100万个不同的值。 因此,select性是1000000/1000000 = 1.0(尽pipe有罕见的历史例外,SSN旨在是唯一的)。

但是该表中的另一列“性别”在100万行中可能只有两个不同的值。 2/1000000 =非常低的select性。

具有UNIQUE或PRIMARY KEY约束的索引保证具有1.0的select性,所以它总是和索引一样有效。

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

您在评论中是否使用MyISAM或InnoDB。 在MySQL中,他们使用术语存储引擎 。 这两个存储引擎之间存在一些细微的差别,但主要的是:

  • InnoDB支持交易,所以你可以select回滚或提交更改。 MyISAM实际上总是自动提交。
  • InnoDB强制执行外键约束。 MyISAM不强制甚至不存储外键约束。

如果这些function是您的应用程序中需要的东西,那么您应该使用InnoDB。


回应你的评论,并不是那么简单。 在很多情况下,InnoDB实际上比MyISAM更快,所以它取决于应用程序的select,更新,并发查询,索引,缓冲区configuration等。

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

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

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

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

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

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

另一方面,其他一些引擎(特别是MyISAM)不会聚集PK,所以主键就像普通的唯一索引。