Database-MySQL 索引数据结构 B+ Tree 和 Hash

MySQL 索引数据结构 B+ Tree 和 Hash

索引数据结构

B Tree

B Tree 是一种多叉平衡查找树

特点

  • B树的节点中存储这多个元素,每个内节点有多个分叉。
    • 通过增加树的分叉树,将树的体型从高瘦变成了矮胖。
    • 比二叉树效率高,因为减少了磁盘 IO 次数(加载每个节点需要一次 IO)。
  • 节点中的元素包含键值和数据,节点中的键值从大到小排列。也就是说,在所有的节点中都存储数据。
    • 构建1百万条数据,树的高度需要2层就可以(1000*1000=1百万),也就是说只需要两次磁盘IO操作就可以查询到数据
  • 父节点当中的元素不会出现在子节点中
  • 所有的叶子节点都位于同一层,叶子节点具有相同的深度,叶子节点之间没有指针连接

结构

Database-Index-Btree-Structure

查找流程

Database-Index-Btree-Search

存在问题

  • B树不支持范围查询的快速查找
    • 查询10到35之间的数据,查找到10之后,需要回到根节点重新遍历查找,需要从根节点进行多次遍历,查询效率有待提高
  • 如果data存储的是行记录,行的大小随着列数的增加,所占空间会变大
    • 这时一页中可存储的数据量就会减少,树相应就会变高,磁盘IO次数就会随之增加

B+ Tree

MySQL 在 B 树的基础上进行改造,使用 B+ 树构建索引

特点

  • B树
    • 叶子节点和非叶子节点都会存储数据
  • B+树
    • 只有叶子节点才会存储数据,非叶子节点只存储键值key
    • 叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表

结构

Database-Index-BPlustree-Structure

查找流程

Database-Index-BPlustree-Search

Hash

底层是哈希表:

  • 适用于大多数需求都是单条记录查询
    • 不支持范围快速查找,范围查找时只能通过扫描全表的方式,筛选出符合条件的数据
  • Key 可以存储索引列,Value 可以存储行记录或者行磁盘地址