首页 文章

mysql 5.0索引 - 唯一与非唯一

提问于
浏览
56

在性能方面,mysql唯一索引和非唯一索引之间有什么区别?假设我想在2列的组合上创建索引,并且组合是唯一的,但我创建了一个非唯一索引 . 这对mysql的性能或内存有什么重大影响吗?同样的问题,主键和唯一索引之间是否存在差异 .

2 回答

  • 2

    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,显然不可能说一个比另一个快 .

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

  • 123

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

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

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

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

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

相关问题