【问题标题】:Unique constraint in MySQLMySQL中的唯一约束
【发布时间】:2010-11-16 02:18:58
【问题描述】:

默认情况下,唯一约束是索引吗?如果不是,在SELECT ... WHERE 子句中使用唯一约束时,它是否具有与索引列相同的性能结果?

谢谢

【问题讨论】:

    标签: mysql performance database-design unique-constraint database-indexes


    【解决方案1】:

    在开始使用唯一约束之前检查主键约束。

    主键约束相当于声明一个唯一约束和一个非空约束。如果主键中有多个列,则每一列都有一个非空约束,但唯一约束适用于所有列。

    当您声明主键时,DBMS 将为您创建一个索引。如果您愿意,您可以删除索引,但是当 DBMS 进行表扫描以检查唯一性时,您将获得糟糕的性能。

    主键约束强制实体完整性,而 REFERENCES(外键)约束强制参照完整性。它们一起在确保数据完整性方面大有帮助。

    【讨论】:

      【解决方案2】:

      UNIQUE 实际上是 on 一个索引的约束,所以是的,UNIQUE 意味着在您强制唯一性的字段上有一个索引。

      【讨论】:

      • 所以现在我又困惑了,我应该在我的创建表中放入以下内容:唯一(电子邮件)还是:唯一索引(电子邮件)?
      【解决方案3】:

      唯一性约束是一种表达某事物(如属性值的某种组合)在整个关系(“表”)范围内必须是唯一的事实的方式。

      这是在逻辑设计级别。

      索引是帮助强制执行此类约束的一种可能有用的方法。

      这是在物理设计级别。

      某些 DBMS 产品可能会根据某些逻辑设计构造(例如 UNIQUE 约束)的存在来推断某些物理设计构造(例如某些索引的存在)。其他人可能不会。

      【讨论】:

        【解决方案4】:

        唯一约束必然是索引。您通常将其定义为“唯一索引”。在任何情况下都需要一个索引来有效地实现唯一约束,因此拥有一个索引并不是缺点。

        【讨论】:

          【解决方案5】:

          约束实际上与索引非常不同:它只是说 MySQL 应该为您强制执行唯一性。然而,索引(尽管它可以是唯一的)与硬盘上的物理顺序有关,或者与允许在列上有效搜索的其他结构(通常是树)有关。

          但是,您可能会将所有这些与定义(通常是聚集的)唯一索引的主键混淆。

          【讨论】:

          • 所以可以说在我的表中我有一列“email”,我做了几次查询“select * from tbl where email like 'something'”。此列是唯一列,但它不是主键。那么我索引它会更好的性能吗?
          • @Kai:是的,索引会在读取数据时提高性能(写入数据可能会受到阻碍)。唯一约束仅意味着对于表中的所有行,为其定义了唯一约束的列中的值将是唯一的 - 没有两个电子邮件列的值会相同。
          猜你喜欢
          • 2017-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 2019-02-27
          • 2010-11-23
          相关资源
          最近更新 更多