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

mysql为什么使用B+树

B+树结构 and 为什么

数据结构演示网页

索引结构默认使用B+树,而不是二叉树,红黑树,b树,哈希

为什么?

什么是索引

索引就是一种单独的数据结构,用来对数据库的数据进行快速检索的数据结构,他针对某个表中的一列或者多列。

简单的说就相当于图书的目录,你可以根据目录快速找到自己想要的内容

二叉树

每个根节点最多有两个子节点

二叉搜索树 – 左子树小于根节点,右子树大于父节点,二分搜索的结构化

最好情况 – logN

最坏情况 – n

红黑树

自平衡的二叉搜索树

特性:

  • 每个节点都是黑色或者红色的
  • 根节点是黑色的
  • 如果一个节点是红色,他的子节点一定是黑色
  • 从一个节点到该节点所有叶子节点的路径上包含相同数据的黑色节点
  • 所有叶子节点都是黑色的(叶子节点的值为null)

即使红黑树 也是一个二叉树,随着数据量的增多,红黑树的层级会越来越深,检索速度会越来越慢

B-树

红黑树是一个二叉树,那B树就是一个多叉树,B树每个节点有多个分支,即多叉
在这里插入图片描述

特点:

  • 在B树中,所有叶子结点和非叶子节点都会储存数据!!
  • n阶的B树只能储存n-1个key, n个指针
  • 一旦节点储存的数量达到n,就会发生裂变,中间元素向上分裂

B+树

B+树是B树的一个变种

在这里插入图片描述

和B树的区别:

  • 只有叶子结点才会储存数据!!
  • 非叶子节点只会储存索引
  • 叶子节点之间会形成一个链表,这个链表的所有元素都是有序排列的

Mysql的B+树

Mysql对经典的B+树进行了优化,在原有的基础上,增加了指向相邻叶子节点的指针,把一个单向的链表变成了双向链表,这样就更方便查找了

B+树只有叶子结点储存数据

在这里插入图片描述

为什么使用B+树

Innodb的逻辑储存结构
在这里插入图片描述

  • 表空间
  • 区 – 一个去64页, 1M
  • 页 – 一页16k ,16 * 1024
  • 行 – 数据是按行进行存放的

为什么使用B+树

  • 和二叉树相比。B+树层级更低,索引效率高

  • 和B树相比。B树和B+树的索引的叶子节点都是储存在一个页上面的,而页的大小是固定的。

    • B+树的非叶子结点只存储键值和指针,而B树连带数据一起存储。这样就导致相同大小的页,使用B树的键值和指针会变少,就会增加树的高度,增加IO次数,导致性能降低
  • 和哈希相比,B+树支持范围查找,排序查找,而哈希不支持

思考题:

假设:一行数据大小为1k,一页可以储存16行这样的数据。Innodb的指针占用6个字节的空间,键值采用BigInt,查8个字节的空间,问能储存多少数据

索引由键值和指针组成,n个键,n+1个指针

n*8 + (n+1) * 6 = 16 * 1024 , 计算得出 n = 1170

高度为2:

​ 1171 * 16 = 18736

高度为3

​ 1171 * 1171 * 16 = 21,939,856

相关文章:

  • 爬虫学习笔记 -- 实战某电影网(lxml库版)
  • hive on spark下row_number()问题排查
  • 最新面试题:用友OC,美团三面已挂
  • 开发者API管理神器Eolink,比postman好用
  • Mysql - 分库分表
  • 计算机毕业设计django基于python的高校奖学金管理系统(源码+系统+mysql数据库+Lw文档)
  • 软件测试的学习笔记(1)
  • c++11基础
  • 一个发誓不用Java的程序员,不得不在太空中调试Lisp
  • Android音频子系统(十一)------耳机返听(耳返)原理实现
  • 【探花交友】前后端分离、开发工具、环境搭建
  • FPGA 之 时序分析
  • 【Android进阶】13、对话框
  • RTX3090+win10+CUDA11.6+cudnn8.5.0+pytorch1.12.1 环境——个人配置经验
  • 第二章 Hadoop环境配置之虚拟机安装配置
  • 【Linux系统编程】快速查找errno错误码信息
  • Android Studio:GIT提交项目到远程仓库
  • Angular 4.x 动态创建组件
  • C# 免费离线人脸识别 2.0 Demo
  • classpath对获取配置文件的影响
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js写一个简单的选项卡
  • Python学习之路16-使用API
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 翻译:Hystrix - How To Use
  • 理清楚Vue的结构
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 你对linux中grep命令知道多少?
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 进程与线程(三)——进程/线程间通信
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #git 撤消对文件的更改
  • (1)SpringCloud 整合Python
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (2)MFC+openGL单文档框架glFrame
  • (javascript)再说document.body.scrollTop的使用问题
  • (独孤九剑)--文件系统
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)jdk与jre的区别
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net core控制台应用程序初识
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NetCore 如何动态路由
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .net生成的类,跨工程调用显示注释
  • .NET实现之(自动更新)
  • .NET学习教程二——.net基础定义+VS常用设置