@(MySQL 笔记)[MySQL, InnoDB, 数据库]
5.1 InnoDB 索引
InnoDB 主要支持:
- B+ 树索引
- 全文索引
- 哈希索引:InnoDB 支持的索引是自适应的,InnoDB 存储引擎会根据表的使用情况,自动生成哈希索引,不可以人为干预。
5.3 B+ 树
B+ 树是为磁盘或其他直接存储辅助设备设计的一种平衡查找树。B+ 树所记录的值都是按照大小顺序存储在叶子节点上。叶子节点之间通过前后指针连接在一起(包括头尾节点),形成一条循环双向链表B+ 树能够在插入删除过程中,保持树的平衡。但这些操作会导致大量的查分子节点的操作B+ 树索引:本质就是B+ 树在数据库中的应用。特点是高扇出性,即数据库中B+ 树的高度一般在2~3层,IO 操作较少。聚集索引:按照每张表的主键构建B+ 树,每个叶子节点存储表中的每一行数据,因此将聚集索引中的叶子节点成为数据页。- 表中的数据存放时,只能有一种存放的顺序。因此每张表中只能有一个
聚集索引。 - 查询优化器优先采用聚集索引,因为聚集索引上有实际保存的表中的每行数据。
- 由于
B+ 树的优势,采用聚集索引查询范围数据非常快
- 表中的数据存放时,只能有一种存放的顺序。因此每张表中只能有一个
非聚集索引(辅助索引)叶子不保存实际的数据吗,而是保存了实际数据存放的地址,称为书签(Bookmark)。- 每张表可以有多个
非聚集索引,因为非聚集索引不影响实际数据的存放。 - 通过
非聚集索引查找数据时,先查找到非聚集索引的叶子节点,根据叶子节点中所存放的数据的主键,再去聚集索引中根据主键查找数据。 - 通过
预读避免多次离散读。
- 每张表可以有多个
- 访问表中
高选择性的数据,如很少一部分数据时,使用B+ 树才有意义。访问低选择性的数据,如性别,地区等,可选范围很小,没有必要建立B+ 树。- 通过
Cardinality值来判断某字段是否为高选择性。 - 通过
采样的方式统计Cardinality值。 - 更新
Cardinality值的策略是:1. 表中1/16的数据发生过变化。2. 某行的stat_moified_counter字段大于等于2000 亿。
- 通过
B+ 树索引的应用:- 联合索引:存储在单个叶子节点中的
键,由1个变为多个。如单个字段构成的主键( student_id )与多个字段构成的主键( student_id, class_id )。 - 覆盖索引:一个索引包含了所有需要查询的字段的值,只需扫描索引而不必回表。其优点在于:
- 索引要比实际数据小
- 索引值按大小排序,查找速度快
- InnoDB 使用聚集索引组织数据,采用覆盖索引可以避免到叶子节点查找数据
- 联合索引:存储在单个叶子节点中的
5.7 自适应哈希索引
InnoDB 采用除数留余散列方法和链地址冲突处理方法
5.8 全文索引
- InnoDB 支持