当前位置: 首页 > news >正文

MySQL 索引:索引为什么使用 B+树?

Hash 索引不支持顺序和范围查询;

二叉查找树(BST):解决了排序的问题,极端情况下可能会退化成线性链表,查询效率急剧下降;

平衡二叉树(AVL) :通过旋转解决了平衡的问题,但是旋转操作效率太低;

  AVL 树是严格的平衡二叉树,所有节点的左右子树高度差不能超过 1

红黑树 :通过舍弃严格的平衡和引入红黑节点,解决了 AVL 旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO 次数太多;

  红黑树并不追求严格的平衡,而是大致的平衡:

节点是红色或黑色。
根是黑色。
所有叶子都是黑色(叶子是NIL节点)。
每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(简称黑高)。

红黑树保证最长路径不超过最短路径的二倍,因而近似平衡(最短路径就是全黑节点,最长路径就是一个红节点一个黑节点,当从根节点到叶子节点的路径上黑色节点相同时,最长路径刚好是最短路径的两倍)

B 树 :通过将二叉树改为多路平衡查找树,解决了树过高的问题;


B+树 :B 树中每个节点(包括叶节点和非叶节点)都存储真实的数据,B+树中只有叶子节点存储真实的数据,非叶节点只存储键。因此能存更多记录。B+树的叶节点之间通过双向链表链接,因此更适合范围查询和排序查找。

InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗^3)。

也就是说一个深度为3的B+Tree索引可以维护10^3 * 10^3 * 10^3 = 10亿 条记录。(这种计算方式存在误差,而且没有计算叶子节点,如果计算叶子节点其实是深度为4了)

Mysql索引——B+树是怎么提高查询效率?_b+树的查询效率-CSDN博客 

http://www.lryc.cn/news/327240.html

相关文章:

  • 2024年第四届天府杯全国大学生数学建模竞赛B题思路
  • c++部分题
  • 验证回文串
  • vue2高德地图选点
  • Gitflow:一种依据 Git 构建的分支管理工作流程模式
  • 利用云手机技术,开拓海外社交市场
  • 脚本实现Ubuntu设置屏幕无人操作,自动黑屏
  • 16.JRE和JDK
  • C++从入门到精通——命名空间
  • JAVA面试大全之JAVA新特性篇
  • 【ZZULIOJ】1008: 美元和人民币(Java)
  • LeetCode刷题笔记之动态规划(三)
  • Unity编辑器功能将AB资源文件生成MD5码
  • 【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)
  • 什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题?
  • 如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问
  • 智能写作利器ChatGPT:提升论文写作效率
  • 【iOS ARKit】3D文字
  • 第二百二十八回
  • Java设计模式之单例模式(多种实现方式)
  • Miracast投屏探索
  • 2024年幻兽帕鲁服务器优惠价格表手动整理,最全报价
  • 使用Python自动备份重要文件:一步一步的教程
  • python学习
  • 【使用redisson完成延迟队列的功能】使用redisson配合线程池完成异步执行功能,延迟队列和不需要延迟的队列
  • Linux 性能分析工具 perf 的使用指南
  • 【QT入门】 Qt代码创建布局之水平布局、竖直布局详解
  • C 传递数组给函数
  • 二次开发Flink-coGroup算子支持迟到数据通过测输出流提取
  • 【容器源码篇】Set容器(HashSet,LinkedHashSet,TreeSet的特点)