首页/数据/SQL 速查/唯一索引与普通索引怎么选
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

唯一索引与普通索引怎么选

唯一索引承担业务约束、等值查找命中即停;普通索引允许重复值、用于支撑查询。约束真与查询快是两件事。

SQL 速查数据更新于 2026-10-12

示例

示例
-- 业务唯一:注册邮箱不允许重复
ALTER TABLE users ADD UNIQUE KEY uk_email (email);

-- 仅查询支撑:允许重复值
ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at);

-- PostgreSQL:唯一约束会创建唯一索引
ALTER TABLE users ADD CONSTRAINT uk_users_email UNIQUE (email);
查找差异唯一索引等值命中可提前结束;普通索引还要继续检视重复值
写入成本唯一索引插入要做冲突检查,并发冲突需业务处理(重试或 upsert)
NULL两库默认允许唯一索引中出现多个 NULL(PG 可用 NULLS NOT DISTINCT 改变)

易错点

  • 把查询优化寄托在唯一索引上:唯一性由业务决定,普通重复值列上无法改用唯一索引
  • 用唯一索引当并发互斥:插入冲突会报错,需要配套重试或 upsert 逻辑

数据来源与参考

  • MySQL 8.0 Reference Manual · How MySQL Uses Indexes
  • PostgreSQL Documentation · Unique Indexes
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌