MySQL中普通索引、主索引、唯一索引有何区别
💡 2025年Java面试宝典抢先下载:
🔵 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码:9b3g(建议保存备用)
🛠️ 一、普通索引(Normal Index)
普通索引是最基础的索引类型,纯粹为了加速查询而存在。它的特点很直白:
- 允许重复值:同一字段可以有多条相同记录
- 允许空值:字段内容可以为NULL
- 无约束:不强制数据唯一性
- 可多列:支持联合索引
-- 创建普通索引的典型语法
CREATE INDEX idx_name ON users(name);
面试常考点:当面试官问“如何优化模糊查询LIKE '%abc'”时,普通索引无法命中这种左模糊查询,这是高频考点❗

🔑 二、主索引(主键索引, Primary Key Index)
主索引是InnoDB存储引擎的物理存储依据,必须掌握三个核心特性:
- 唯一性:值绝对不允许重复
- 非空性:
NOT NULL是强制要求 - 聚簇索引:数据行直接存储在索引的叶子节点(划重点!)
-- 创建主键索引(建表时)
CREATE TABLE users (
id INT PRIMARY KEY, -- 主索引在此定义
name VARCHAR(20)
);
⚠️ 高频面试题:为什么主键推荐用自增整型?
答:避免页分裂!B+树叶子节点按主键顺序存储,随机主键(如UUID)会导致频繁数据移动。
🚫 三、唯一索引(Unique Index)
唯一索引在普通索引基础上增加了数据唯一性约束:
- 值必须唯一:重复值插入会触发错误
- 允许空值:但NULL也有特殊性(多个NULL不算重复)
- 约束优先:业务层面需要唯一性时使用
-- 创建唯一索引(确保邮箱不重复)
CREATE UNIQUE INDEX uni_email ON users(email);
📌 与主索引的关键区别:
- 一个表只能有一个主索引,但可创建多个唯一索引
- 主索引必为聚簇索引(InnoDB),唯一索引是非聚簇索引
💎 三大索引对比速查表
| 特性 | 普通索引 | 主索引 | 唯一索引 |
|--------------|----------------|------------------|----------------|
| 唯一性 | ❌ 允许重复 | ✅ 绝对唯一 | ✅ 值必须唯一 |
| 空值 | ✅ 允许NULL | ❌ 禁止NULL | ✅ 允许NULL |
| 数量限制 | 无限制 | 每表仅一个 | 可建多个 |
| 是否聚簇 | 非聚簇 | ✅ 聚簇索引 | 非聚簇 |
| 创建方式 | CREATE INDEX | PRIMARY KEY | UNIQUE INDEX |
❓ 高频面试场景还原
面试官:”假设有用户表需要根据手机号快速查询,但手机号可能未录入,应该建什么索引?“
参考答案:
“推荐使用普通索引。因为:
- 手机号需要快速查询 → 索引满足
- 允许未录入 → 字段可为NULL(唯一索引和主索引对空值有限制)
- 业务未要求绝对唯一 → 无需唯一约束的额外开销”
🎁 特别福利时间
准备面试需要好资料?这里有个小技巧:
通过 面试鸭返利网 购买面试鸭会员,找我返现 25元!
已有300+程序员成功薅羊毛,点击直达👉 mianshiyafanli.com

💡 技术选型建议
- 主索引首选自增整型 → 减少页分裂
- 唯一索引用于业务唯一约束(如身份证号)
- 普通索引覆盖高频查询字段(注意避免过度索引)
- 更新频繁的字段慎用索引 → 维护成本高
索引不是银弹!曾见某电商给性别字段加索引,查询反而更慢 —— 区分度低的字段建索引等于浪费资源。
欢迎在评论区交流你的索引优化案例! 👇


