索引的分类
从数据结构角度
- B+tree
- Hash
- Full-texts 索引
- R-Tree
从物理存储的角度
- 聚集索引
- 二级索引(辅助索引)
从索引字段特性角度
- 主键索引
- 唯一索引
- 普通索引
- 前缀索引
从组成索引的字段个数角度
- 单列索引
- 联合索引(复合索引)
数据结构角度
InnoDB,MyISAM 和 Memory 分别支持的索引类型
索引 | MyISAM引擎 | InnoDB引擎 | Memory引擎 |
---|---|---|---|
B-Tree索引 | 支持 | 支持 | 支持 |
HASH索引 | 不支持 | 不支持 | 支持 |
R-Tree索引 | 支持 | 不支持 | 不支持 |
Full-text索引 | 支持 | 不支持 | 不支持 |
物理存储角度
InnoDB 的索引
InnoDB的主键索引与行记录是存储在一起的,故叫做聚集索引):
- 没有单独区域存储行记录
- 主键索引的叶子节点,存储主键,与对应行记录(而不是指针)
- 画外音:因此,InnoDB的PK查询是非常快的。
因为这个特性,InnoDB的表必须要有聚集索引:
(1)如果表定义了PK,则PK就是聚集索引;
(2)如果表没有定义PK,则首个非空unique列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
聚集索引,也只能够有一个,因为数据行在物理磁盘上只能有一份聚集存储。
InnoDB的二级索引可以有多个,它与聚集索引是不同的:
二级索引的叶子节点,存储主键(也不是指针)
回表查询:由于二级索引的叶子节点不存储完整的表数据,所以当通过二级索引查询到聚簇索引的列值后,还需要回到聚集索引也就是表数据本身进一步获取数据
索引覆盖:二级索引查询时,回表不是必须的过程,当 Query 的所有字段在二级索引中就能找到时,就不需要回表
MyISAM 的索引
MyISAM的索引与行记录是分开存储的,叫做非聚集索引
其主键索引与普通索引没有本质差异:
- 有连续聚集的区域单独存储行记录
- 主键索引的叶子节点,存储主键,与对应行记录的指针
- 普通索引的叶子结点,存储索引列,与对应行记录的指针
MyISAM的表可以没有主键。
主键索引与普通索引是两棵独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录。