《MySQL 技术内幕-InnoDB 存储引擎》- 第 5 章:索引与算法

347 阅读3分钟

@(MySQL 笔记)[MySQL, InnoDB, 数据库]

5.1 InnoDB 索引

InnoDB 主要支持:

  1. B+ 树索引
  2. 全文索引
  3. 哈希索引:InnoDB 支持的索引是自适应的,InnoDB 存储引擎会根据表的使用情况,自动生成哈希索引,不可以人为干预。

5.3 B+ 树

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

5.7 自适应哈希索引

InnoDB 采用除数留余散列方法和链地址冲突处理方法

5.8 全文索引

  • InnoDB 支持