小编典典

MySQL 5.0索引-唯一与非唯一

mysql

就性能而言,MySQL唯一索引和非唯一索引有什么区别?

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

同样的问题, 键和 唯一 索引之间有区别吗?


阅读 311

收藏
2020-05-17

共1个答案

小编典典

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

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

例如,在“社会保险号”列中,您可能有100万行,其中包含1百万个不同的值。因此,选择性为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,以至于不可能说一个比另一个更快。

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

2020-05-17