mysql B+Tree

文章目录

  • MySql
    • 系列文章
    • 索引是什么?
      • 平衡二叉树
      • 绝对平衡树B-Tree
      • mysql B+Tree
    • 系列链接

MySql

系列文章

  • mysql 性能优化 | 第一篇 mysql B+Tree
  • mysql 性能优化 | 第二篇 MySql Myisam和innodb对比 索引优化建议
  • mysql 性能优化 | 第三篇 mysql存储引擎
  • mysql 性能优化 | 第四篇 mysql数据库的隔离级别
  • mysql 性能优化 | 第五篇 mysql 表锁 行锁
  • mysql 性能优化 | 第六篇 mysql MVCC Undo Redo
  • mysql 性能优化 | 第七篇 mysql 执行路径 执行计划 慢查询
  • mysql 性能优化 | 第八篇 mysql 配置优化

索引是什么?

索引是为了加速对表数据行的查询(检索)而创建的一种分散存储的数据结构
mysql B+Tree_第1张图片

  • 索引能极大的减少存储引擎需要扫描的数据量
  • 索引可以把随机IO变成顺序IO
  • 索引可以帮助我们再进行分组、排序等操作时,避免使用临时表

平衡二叉树

AVL树就是平衡二叉树,包括红黑树也是平衡二叉树的一种
mysql B+Tree_第2张图片

这里可以看之前写的两篇文章

  • java实现二叉查找树

  • java实现AVL树

mysql中索引使用的是B+Tree

不选择平衡二叉树的原因

  • 太深了
    • 每个节点存储一个关键字,两条路导致树的深度会比较深

数据的深度决定这IO操作次数,IO操作耗时长

  • 太小
    • 每个节点存储一个关键字,存储的信息比较少

每一个磁盘块(节点/页)保存的数据量小

没有很好的利用操作磁盘IO的数据交换特性,也没有利用好磁盘的IO预读功能(空间局部性原理),从而带来频繁的IO操作

绝对平衡树B-Tree

mysql B+Tree_第3张图片

  • 每个节点如果存储两个关键字,每个节点可以保存更多的数据
  • 三条路保证树深度的减少,路数越多,树的深度越小

如何来维持树的平衡

  • 和AVL树或者红黑树不一样,不是通过旋转来完成

  • 如果新增或者删除导致树的平衡发生变化,会通过节点的合并或者拆分,让树再次达到平衡

可以通过这个网站进行模拟
B-Tree模拟网站
Max. Degree = 3 表示3路

多路平衡查找树

mysql一次IO默认16k数据

比如定义一个int型的字段(4Byte)

一个单位的大小=一个int(4Byte) +子引用的大小(假设4Byte)

mysql一次IO的大小 = 16*1024Byte

mysql一次IO的大小(byte) 一个单位大小(byte) 存储关键字的数量
16*1024 8 2048~

这只是一个大概的估算,只能做参考,辅助理解

一个节点可以保存2048个关键字,2049路

多路平衡树的优势

  • 单个节点存储的数据量大
  • 树的深度低

mysql B+Tree

mysql B+Tree_第4张图片

  • 节点关键字搜索采用左闭合
    • 对索引中的关键字进行计算(对比),一定是从左往右依次进行,且不可跳过
  • 所有的数据都保存在叶子节点
  • 支节点只保存关键字和子节点引用,不再保存数据区
  • 叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系

B+Tree优点

  • B+树是B-树的变种多路绝对平衡树,拥有B-树的优势
  • B+树扫库、表能力更强,因为左闭合扫描到叶子节点之后可以一直在叶子节点中搜索,因为叶子节点的相邻节点具有顺序引用的关系
  • B+树的磁盘读写能力更强,支节点不保存数据区,保存的关键字更多
  • B+树的排序能力更强
  • B+树的查询效率更加稳定(大数据量,大部分情况下)

系列链接

下一篇:MySql Myisam和innodb对比 索引优化建议

你可能感兴趣的:(数据库,mysql,性能优化)