Files
Hui-s-notebook/logseq-java/pages/B+树.md
2024-02-02 00:12:49 +08:00

2.9 KiB
Raw Blame History

  • 每个页大小为16K页的结构
    • 页标识
    • 最小记录record_type=2
    • 最大记录record_type=3
    • 普通记录record_type=01是B+树非叶子节点记录
    • recore_type+next_record+c1列+c2列+c3列+其他信息该id所在页
  • 非叶子节点不存储数据,之存储主键,页之间使用双向链表连接,方便范围和反向排序查询
  • 聚簇索引
    • 主键作为索引的值
    • 索引和数据保存在同一个文件中
    • 页内记录按照主键大小排序排成一个单向链表
    • 页和页之间根据主键大小排序成一个双向链表
    • 非叶子节点存储记录主键和页号
    • 叶子节点存储完整的用户记录
    • 优点
      • 数据访问更快
      • 对于主键排序查找和范围查找非常快
      • 查询一定范围数据是由于数据相连可以从更少数据快中提取数据节省IO操作
    • 缺点
      • 插入速度依赖插入顺序,按照主键顺序插入最快,否则会出现页分裂,影响性能
      • 更新主键代价非常高,将导致被更新的行移动
    • 限制
      • 只有InnoDB支持MyISAM不支持
      • 每个表只能有一个
      • 没有定义主键时将选取非空唯一列代替没有就隐式定义一个主键rowID
      • 为了充分利用表中主键应该选择有序的ID不建议使用UUIDMD5Hash字符串作为主键
    • 查找和匹配逻辑
      • 根据第一层对应的范围找到第二层的页地址
      • 根据第二层的数据找到对应的下一层页地址直到找到record_type=0存放普通数据的叶子节点的页地址
      • 再叶子节点上定位到对应的数据
  • 非聚簇索引
    • 非主键索引外的其他索引
    • 页间的记录根据所选类的大小排序
    • 页和页也是通过双向链表连接的
    • 非叶子节点记录数据值和页号
    • 非叶子节点存储数据值和主键
    • 可以有多个
    • 查找匹配逻辑
      • 查找的过程与聚簇索引前面一样
      • 找到对应记录的主键数值
      • 根据主键值去聚簇索引中查找一遍
  • 二叉树平衡二叉树红黑树B树的区别
    • 二叉树
      • 不能平衡,容易变成链表
    • 平衡二叉树
      • 可以通过自旋转保证左右两边高度平衡
      • 树的高度过高
    • 红黑树
      • 自旋速度比较快
      • 非严格平衡二叉树
    • B树
      • 非叶子节点页存储数据
  • 一个B+树存放多少索引记录
    • 三层千万级别
    • 数据占用1KB指针和键值10字节
    • 16x1600x1600=40960000
  • B+树crud效率如何
    • 新增和删除比较麻烦,需要更新索引,查询和更新效率高
    • O(lognN) N为高度
  • 自适应哈希索引
    • InnoDB一个特殊功能某些索引值使用非常频繁会再内存中基于B+树所有值之上创建一个哈希索引,从而具有哈希索引一些特点
  • 2-3树2-3-4树
    • 多叉树允许每个节点可以有更多的数据项和子节点,通过增加分叉减少树的高度