索引存储结构

InnoDB 采用 B+ 树来存储索引。

'索引' 概念 & SQL.png|400

B+ 树中各个页之间是通过双向链表连接的,叶子节点中的数据是通过单向链表连接的。

B+Tree vs BTree

  1. B+树中,所有的数据都存放到叶子节点中,并且可以在叶子节点上支持遍历查找。
  2. B 树,数据存放在叶子节点或非叶子节点中。
  3. 由于 B 树部分数据存放在非叶子节点中,因此每个页上可以放的索引数目降低,即相同的数据,B 树的高度要高于 B+树的高度,磁盘访问次数增多。

索引使用 B+Tree?

和 b 树、红黑树、hash 表、avl 树、二叉搜索树的比较。

  • Hash 表,依赖于哈希函数,数据量大时冲突较多,适用于内存情况,不支持顺序和范围查找。
  • 二叉搜索树,依赖于数据插入的顺序,如果按主键大小顺序插入,那么查找的时候就是 O (n) 复杂度。
  • avl 树,为了避免二叉搜索树,进行平衡,平衡较麻烦。
  • 红黑树,为了减少 avl 树的平衡。
  • 这三种树都主要适用于内存,如果一个节点存放到一个磁盘块上,资源耗费多;并且不支持顺序和范围查找。
  • B 树,一个节点中可以存放多个数据,适用于索引的构建。但是不支持顺序和范围查找。
  • B+树,除了顺序和范围查找,由于数据都存放到叶子节点上,其他节点上就只需要存放索引就可以,如此存放的分支更多,相同的数据量,B+树能够存放的高度更低,IO 次数更少。

进一步了解

二级索引&联合主键的存储

为什么删除大量数据后,数据表还是很大?