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

MYSQL:简述对B树和B+树的认识

MySQL的索引使用B+树结构。

1、B树

在说B+树之前,先说说B树,B树是一个多路平衡查找树,相较于普通的二叉树,不会发生极度不平衡的状况,同时也是多路的。

B树的特点是:他会将数据也保存在非叶子节点。而这个特点会导致非页子节点不能存储大量的索引。如下图所示:
在这里插入图片描述

2、B+树

针对B树的特点,B+树做了优化。如下图所示:
在这里插入图片描述
我们看到,B+树将所有的data数据都保存到了叶子节点中,非叶子节点只保存索引和指针。

我们假设一个非叶子节点是16kb,每个索引,即主键是bigint,即8b,指针为8b。那么每页能存储大约1000个索引(16kb/ (8b + 8b))。而一颗3层B+树能够存储多少索引呢?如下图:
在这里插入图片描述
大约能够存储10亿个索引。通常B+树的高度在2-4层,由于MySql在运行时,根节点是常驻内存的,因此每次查找只需要大约2-3次IO。可以说,B+树的设计,就是根据机械磁盘的特性来进行设计的。

综上:
1、MySql 的主键不应该太大,如果使用 UUID 这种,将会浪费 B+ 树的非叶子节点。
2、MySql 的主键最好是自增的,如果使用 UUID 这种,每次插入都会调整 B+树,从而导致页分裂,严重影响性能。
3、如果项目中使用了分库分表,我们通常都会需要一个主键进行 sharding,那怎么办呢?在实现上,我们可以保留自增主键,而逻辑主键用来作为唯一索引即可。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用maven搭建微服务框架
  • 基于七牛云上传,下载文件
  • 【数据库】两个集群数据实现同步方案
  • Node.js-身份证号实名认证-小程序实名认证接口集成方法
  • C语言中的预处理器字符串化与拼接操作符:底层原理及实现细节
  • 谷歌发布新AI GameNGen:AI也能实时生成游戏画面!
  • C++ day3
  • OpenStack创建云主机——超级详细步骤
  • Java的IO模型详解-BIO,NIO,AIO
  • Java并发编程(21)—— CurrentHashMap源码分析
  • redis集群部署
  • 字符串的内存存储
  • 使用Python+docx+sqlite3将Word表格内容写入sqlite表中
  • 区块链入门
  • Postman注册使用
  • 2017 年终总结 —— 在路上
  • CSS实用技巧干货
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • JWT究竟是什么呢?
  • k8s如何管理Pod
  • leetcode讲解--894. All Possible Full Binary Trees
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 后端_MYSQL
  • 力扣(LeetCode)21
  • 前言-如何学习区块链
  • 思否第一天
  • 走向全栈之MongoDB的使用
  • ionic入门之数据绑定显示-1
  • 国内开源镜像站点
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • !$boo在php中什么意思,php前戏
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (14)Hive调优——合并小文件
  • (16)Reactor的测试——响应式Spring的道法术器
  • (LeetCode) T14. Longest Common Prefix
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)计算机毕业设计大学生兼职系统
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)项目管理杂谈-我所期望的新人
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Core中如何集成RabbitMQ
  • .NET delegate 委托 、 Event 事件
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @WebService和@WebMethod注解的用法