2. 索引分类
Q: 索引的分类有哪些?
按功能分类
主键索引
- InnoDB主键是默认的索引,数据列不允许重复,不允许为NULL
- 一个表只能有一个主键
唯一索引
- 数据列不允许重复,允许为NULL值
- 一个表允许多个列创建唯一索引
普通索引
- 基本的索引类型,没有唯一性的限制,允许为NULL值
组合索引
- 多列值组成一个索引,用于组合搜索,效率大于索引合并
按存储结构分类
聚簇索引
- 定义:索引的顺序和数据行的存储顺序是一致的,叶子节点存放所有数据
- 特点:一般是主键索引
- InnoDB规则:
- 默认以主键作为聚簇索引
- 如果没有主键,选第一个非空唯一索引
- 如果还没有,InnoDB自动生成隐藏的rowid
非聚簇索引(二级索引)
- 定义:叶子节点存放的是指向主键的指针
- 特点:查询的时候需要通过主键回表获取到所有的数据
二级索引查询流程:
name索引树 → 找到主键id → 主键索引树 → 找到完整行数据(回表)Q: 什么是回表?
在InnoDB存储引擎里,利用辅助索引查询,先通过辅助索引找到主键索引的键值,再通过主键值查出主键索引里面符合要求的数据,它比基于主键索引的查询多扫描了一棵索引树,这个过程就叫回表。
Q: 什么是覆盖索引?
在辅助索引里面,不管是单列索引还是联合索引,如果select的数据列只用辅助索引中就能够取得,也就是说可以把索引范围覆盖我们要查询的范围,这也就不用去查主键索引,避免了回表。
-- 假设有联合索引 (name, age)
SELECT name, age FROM users WHERE name = 'Alice';
-- ✅ 覆盖索引,无需回表
SELECT name, age, email FROM users WHERE name = 'Alice';
-- ❌ email 不在索引中,需要回表Q: 什么是索引合并?
当单表存在多个索引,一个SQL语句的where中又含有多个索引字段,在执行SQL语句时每个索引都可能返回一个结果集,MySQL会将其求交集或者并集,或者是交集和并集的组合。也就是说一次查询中可以使用多个索引。
性能提示:覆盖索引可以避免回表,大幅提升查询性能。设计索引时要考虑查询的SELECT字段。