索引分类
一、按功能分类
| 分类 | 含义 | 特点 | 关键字 |
|---|---|---|---|
| 主键索引 | 针对于表中主键创建的索引 | 默认自动创建,只能有一个 | PRIMARY |
| 唯一索引 | 避免同一个表中某数据列中的值重复 | 可以有多个 | UNIQUE |
| 常规索引 | 快速定位特定数据 | 可以有多个 | — |
| 全文索引 | 全文索引查找的是文本中的关键词,而不是比较索引中的值 | 可以有多个 | FULLTEXT |
二、按存储形式分类(InnoDB)
| 分类 | 含义 | 特点 |
|---|---|---|
| 聚集索引(Clustered Index) | 将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据 | 必须有,而且只有一个 |
| 二级索引(Secondary Index) | 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键 | 可以存在多个 |
聚集索引选取规则
- 如果存在主键,主键索引就是聚集索引;
- 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引;
- 如果表没有主键,或没有合适的唯一索引,则 InnoDB 会自动生成一个 rowid 作为隐藏的聚集索引。
三、回表查询
以 select * from user where name = 'Arm'(name 建有二级索引)为例:
- 先在二级索引中找到
Arm,拿到它对应的主键 id(如 10); - 再拿这个 id 回到聚集索引中查找整行数据 —— 这一步就叫回表查询。
思考:
select * from user where id = 10(主键)比select * from user where name = 'Arm'(二级索引 + 回表)效率高——主键查询直接走聚集索引,一次就能拿到整行数据,不需要回表。