跳至内容

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字段。