Mysql:主键索引 唯一索引 普通索引 前缀索引

这四种索引的区别主要在于:是否唯一、是否自动建立、是否只索引部分字符串

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 组合 多个 只索引字符串前缀,节省空间

需要特别注意:

"前缀索引"描述的是索引范围,"主键、唯一、普通"描述的是索引约束类型,它们不是完全互斥的分类。比如可以有普通前缀索引,也可以有唯一前缀索引

相关推荐
阳光九叶草LXGZXJ1 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
字节渡客2 小时前
Redis键明明过期了,业务还在读到旧数据
数据库·redis·spring
OnlineProxy4 小时前
亚马逊多账号运营:如何在规避“关联封号”风险的同时实现电商规模化扩张
服务器·数据库·redis
辻弋2015 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
可乐鸡翅yeah_6 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
石头麻辣鱼7 小时前
Bamboo 调度系统 OceanBase 适配实战:存储过程迁移踩过的三个大坑
数据库
龙亘川7 小时前
数智驱动民政升级 精准守护民生保障
大数据·数据库·人工智能
念何架构之路7 小时前
zap扩展生态与总结
java·前端·数据库
晚安日记wanna8 小时前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
第七页独白8 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库