【发布时间】:2010-11-16 02:18:58
【问题描述】:
默认情况下,唯一约束是索引吗?如果不是,在SELECT ... WHERE 子句中使用唯一约束时,它是否具有与索引列相同的性能结果?
谢谢
【问题讨论】:
标签: mysql performance database-design unique-constraint database-indexes
默认情况下,唯一约束是索引吗?如果不是,在SELECT ... WHERE 子句中使用唯一约束时,它是否具有与索引列相同的性能结果?
谢谢
【问题讨论】:
标签: mysql performance database-design unique-constraint database-indexes
在开始使用唯一约束之前检查主键约束。
主键约束相当于声明一个唯一约束和一个非空约束。如果主键中有多个列,则每一列都有一个非空约束,但唯一约束适用于所有列。
当您声明主键时,DBMS 将为您创建一个索引。如果您愿意,您可以删除索引,但是当 DBMS 进行表扫描以检查唯一性时,您将获得糟糕的性能。
主键约束强制实体完整性,而 REFERENCES(外键)约束强制参照完整性。它们一起在确保数据完整性方面大有帮助。
【讨论】:
UNIQUE 实际上是 on 一个索引的约束,所以是的,UNIQUE 意味着在您强制唯一性的字段上有一个索引。
【讨论】:
唯一性约束是一种表达某事物(如属性值的某种组合)在整个关系(“表”)范围内必须是唯一的事实的方式。
这是在逻辑设计级别。
索引是帮助强制执行此类约束的一种可能有用的方法。
这是在物理设计级别。
某些 DBMS 产品可能会根据某些逻辑设计构造(例如 UNIQUE 约束)的存在来推断某些物理设计构造(例如某些索引的存在)。其他人可能不会。
【讨论】:
唯一约束必然是索引。您通常将其定义为“唯一索引”。在任何情况下都需要一个索引来有效地实现唯一约束,因此拥有一个索引并不是缺点。
【讨论】:
约束实际上与索引非常不同:它只是说 MySQL 应该为您强制执行唯一性。然而,索引(尽管它可以是唯一的)与硬盘上的物理顺序有关,或者与允许在列上有效搜索的其他结构(通常是树)有关。
但是,您可能会将所有这些与定义(通常是聚集的)唯一索引的主键混淆。
【讨论】: