MySQL 中,主键索引、唯一索引、普通索引和联合索引的介绍

318 阅读2分钟

在 MySQL 中,主键索引、普通索引和联合索引是最常用的索引类型,核心差异体现在用途、约束性、性能上,以下是具体解析:

1. 主键索引(Primary Key Index)

主键索引是用于唯一标识表中每条记录的索引,一张表只能有一个主键索引。

核心特性:

  • 强制唯一性:主键字段的值不可重复,且不能为 NULL(自动约束)。
  • 自动创建:设置 PRIMARY KEY 时,MySQL 会自动生成主键索引,无需手动创建。
  • 性能最优:默认使用 B+Tree 结构,查询、插入、删除效率极高,是表的“行标识”。
  • 典型场景:用于唯一定位一条记录,如用户表的 user_id、订单表的 order_id。

2. 唯一索引(Unique Index)

唯一索引主要用于保证字段值的唯一性,同时兼顾查询加速,是“主键索引的补充”。

核心特性:

  • 唯一性约束:字段值必须唯一,但允许一个 NULL(与主键索引的核心区别)。
  • 手动创建:需通过 CREATE UNIQUE INDEX 索引名 ON 表名(字段名) 创建,一张表可多个。
  • 功能双重性:既约束数据完整性(避免重复),又加速该字段的查询。
  • 典型场景:用于需唯一但无需作为“行标识”的字段,如用户表 phone(避免重复手机号)、商品表 sku_code。

3. 普通索引(Normal Index)

普通索引是最基础的非唯一索引,仅用于加速查询,无唯一性约束,一张表可创建多个。

核心特性:

  • 无约束:索引字段的值可重复、可为 NULL,仅优化查询速度,不影响数据完整性。
  • 手动创建:需通过 CREATE INDEX 索引名 ON 表名(字段名) 手动创建。
  • 用途单一:仅针对单个字段加速查询,不支持多字段联合优化。
  • 典型场景:用于高频查询但无需唯一的字段,如商品表的 category_id(按分类查商品)、用户表的 nickname(按昵称模糊查询)。

4. 联合索引(Composite Index)

联合索引(也称复合索引)是基于多个字段创建的索引,本质是将多个字段的值组合后构建索引结构,一张表可创建多个。

核心特性:

  • 遵循“最左前缀原则”:查询时需从索引的第一个字段开始匹配,否则索引失效(例:联合索引 (a,b,c),仅 a、a+b、a+b+c 的查询能用到索引,b、b+c、a+c 无法用到)。
  • 覆盖查询优势:若查询的字段(如 SELECT a,b FROM 表)均在联合索引中,无需回表查原始数据,性能比单字段索引更高。
  • 典型场景:用于多字段组合查询,如订单表的 (user_id, create_time)(查询某用户某时间段的订单)、商品表的 (category_id, price)(查询某分类下指定价格范围的商品)。