简略总结#
- 索引:帮助存储引擎快速获取数据的一种数据结构,即数据的目录(就像书的目录一样),以空间换时间的设计思想
- 分类:
- 按 [数据结构]:B+Tree 索引、Hash 索引、Full-text 索引
- InnoDB 引擎不支持 Hash 索引
- 创建的主键索引和二级索引默认使用的是 B+Tree 索引
- 按 [物理存储]:聚簇索引(主键索引)、二级索引(辅助索引)
- 主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的数据记录都存放在主键索引的 B+Tree 的叶子节点里
- 二级索引的 B+Tree 的叶子节点存放的是主键值,而不是实际数据
- 查询时使用二级索引:
- 能在二级索引的 B+Tree 里查到就叫覆盖索引(仅查询二级索引的 B+Tree)
- 查不到就还要去聚簇索引的 B+Tree 里面查,这个过程叫回表(先查询二级索引的 B+Tree 拿主键值,再去主键索引的 B+Tree 查询真正的数据)
- 查询时使用二级索引:
- 按 [字段特性]:主键索引、唯一索引、普通索引、前缀索引
- 主键索引:建立在主键字段上的索引,一张表只能有一个主键索引,索引列的值不允许为空
- 唯一索引:建立在 UNIQUE 字段上的索引,一张表可以有多个唯一索引,索引列的值必须唯一,允许有空值
- 普通索引:建立在普通字段上的索引,不要求字段为主键,也不要求字段为 UNIQUE
- 前缀索引:指对字符串类型字段的前几个字符建立的索引,而不是整个字段上建立的索引,节省索引存储空间,提升查询效率
- 允许的字段类型:char、varchar、binary、varbinary
- 按 [字段个数]:单列索引、联合索引
- 单列索引:建立在单列上
- 联合索引:建立在多列上
- 按 [数据结构]:B+Tree 索引、Hash 索引、Full-text 索引
- 索引适用案例:
- 字段值唯一性,比如商品编码
- 经常用于 where 查询条件的字段
- 经常用于 group by 和 order by 的字段
- 索引不适用案例(反例):
- where 条件、group by、order by 里用不到的字段
- 字段中存在大量重复数据(即值分布均匀),比如性别
- 表数据太少时
- 经常更新的字段
- 索引优化:
- 前缀索引优化
- 覆盖索引优化
- 主键索引最好自增
- 索引列设置 NOT NULL
- 防止索引失效