在性能方面,MySQL唯一索引和非唯一索引之间有什么区别?
假设我想在2列的组合上创建索引,并且组合是唯一的,但我创建了一个非唯一索引.这会对MySQL使用的性能或内存产生任何重大影响吗?
同样的问题,主键和唯一索引之间有区别吗?
UNIQUE和PRIMARY KEY是约束,而不是索引.尽管大多数数据库都使用索引来实现这些约束.除了索引之外,约束的额外开销是微不足道的,尤其是当您计算跟踪和纠正无意重复的时间(而不是)它们发生时的成本.
如果您有高选择性,索引通常会更有效.这是不同值的数量与总行数的比率.
例如,在社会安全号码列中,您可能有100万行,其中包含100万个不同的值.所以选择性是1000000/1000000 = 1.0(尽管有罕见的历史例外,SSN的目的是唯一的).
但该表中的另一栏"性别"可能只有两百多万行不同的值.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,显然不可能说一个比另一个快.
与大多数与性能相关的问题一样,为您的应用程序回答它的唯一方法是使用您的应用程序和代表性的数据样本测试这两种配置,并测量结果.