InnoDB中的索引

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

一般我们讨论索引时,通常会讨论以下三种索引

  • B+数索引
  • 全文索引
  • 哈希索引

其中哈希索引主要被用来构建自适应哈希索引来处理一些热点行。

B+树索引

聚簇索引

聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。

B+树的叶子节点是双向链表,在保证了可顺序读取的同时也无需在物理层面顺序存储(这样成本会比较大)。

聚集索引有两个好处

它对主键的排序查找和范围查找很快,前者是因为双向链表无需sort,本身有序。后者是因为范围查询可以通过前几层节点选择页的范围

非聚簇索引

对于非聚簇索引,叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,只包含一个指向聚簇索引的叶子节点的书签。

InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录。

B+树的分裂

由于主键大多可能是自增的,因此如果分裂的时候从中间分裂,很可能造成空间的浪费。因此InnoDB会根据Page Header中的一些信息,判断应该向左还是向右分裂

若往同一方向进行插入的记录数量为5,并且目前已经定位(cursor)到的记录(InnoDB存储引擎插入时,首先需要进行定位,定位到的记录为待插入记录的前一条记录)之后还有3条记录,则分裂点的记录为定位到的记录后的第三条记录,否则分裂点记录就是待插入的记录。

猜你喜欢

转载自juejin.im/post/7086102643596066829