这四种索引的区别主要在于:是否唯一、是否自动建立、是否只索引部分字符串
1. 主键索引
主键索引由PRIMARY KEY创建:
CREATE TABLE users ( id BIGINT PRIMARY KEY, name VARCHAR(50) );特点:
一张表只能有一个主键
主键值必须唯一
不能为NULL
MySQL 会自动创建主键索引
InnoDB 中,主键索引通常是聚簇索引
叶子节点保存完整的行数据
可以把主键理解为每一行数据的唯一身份证号
2. 唯一索引
唯一索引要求索引列的值不能重复:
CREATE UNIQUE INDEX uk_email ON users(email);例如:
a@example.com b@example.com a@example.com -- 不允许重复特点:
一张表可以有多个唯一索引
不允许重复值
MySQL 中唯一索引通常允许多个NULL值
InnoDB 中,如果表已经有主键,唯一索引一般是二级索引
也可以通过表结构定义:
CREATE TABLE users ( id BIGINT PRIMARY KEY, email VARCHAR(100) UNIQUE );主键和唯一索引都保证唯一,但语义不同
主键:这行数据的主要身份标识 唯一索引:某个字段不能重复3. 普通索引
普通索引也叫非唯一索引,允许索引值重复:
CREATE INDEX idx_age ON users(age);例如多个用户都可以是18岁:
18 18 20 25它的主要作用是加快查询:
SELECT * FROM users WHERE age = 18;特点:
一张表可以有多个普通索引
允许重复值
不负责保证数据唯一
通常属于二级索引
4. 前缀索引
前缀索引只对字符串字段的前 N 个字符建立索引:
CREATE INDEX idx_email_prefix ON users(email(10));这表示只索引email的前 10 个字符,而不是整个字段。
例如:
abcdef123456@example.com abcdef123499@example.com如果只建立前 6 个字符的前缀索引,它们在索引中都会表现为:
abcdef特点:
减少索引占用的磁盘空间
降低索引维护成本
适合很长的字符串字段
前缀太短可能导致重复值很多,查询效率下降
查询时可能仍需要回表判断完整字符串
例如:
SELECT * FROM users WHERE email LIKE 'abcdef%';可能使用前缀索引
但:
WHERE email LIKE '%example.com'通常无法有效使用这种索引,因为查询条件不是从字符串开头匹配
前缀索引也可以和唯一索引组合,但此时约束的是“前 N 个字符不能重复”:
CREATE UNIQUE INDEX uk_code_prefix ON products(code(8));这不代表完整的code不能重复,只代表前 8 个字符不能重复
对比总结
| 类型 | 是否唯一 | 一张表可有几个 | 主要作用 |
|---|---|---|---|
| 主键索引 | 必须唯一且非 NULL | 1 个 | 唯一标识记录 |
| 唯一索引 | 不允许重复,通常允许多个 NULL | 多个 | 保证字段唯一并加速查询 |
| 普通索引 | 允许重复 | 多个 | 加速普通查询 |
| 前缀索引 | 取决于是否和 UNIQUE 组合 | 多个 | 只索引字符串前缀,节省空间 |
需要特别注意:
“前缀索引”描述的是索引范围,“主键、唯一、普通”描述的是索引约束类型,它们不是完全互斥的分类。比如可以有普通前缀索引,也可以有唯一前缀索引