为什么MySQL数据库要用B+树存储索引

 

A:为什么MySQL数据库要用B+树存储索引?

Hash的查找速度为O(1),而树的查找速度为O(log2n),为什么不用Hash作为数据库的存储索引呢?

树的话,无非就是前中后序遍历、二叉树、二叉搜索树、平衡二叉树,更高级一点的有红黑树、B树、B+树。

【红黑树】

红黑树也是平衡树中的一种,它复杂的定义以及繁琐的规则无非就是为了保证树的平衡性。一棵红黑树可以保证平衡性,保持平衡性的目的无非就是降低树的高度,提高搜索效率,Java中的TreeSet就是基于红黑树实现的

 

【B树】

B树就是多路搜索树,B树的每个节点都可以拥有多余两个孩子节点,比如一棵M路的B树最多可能拥有M个孩子节点。如下图,是一棵三路的B树,每个节点组多拥有三个孩子节点,同样是一棵搜索树。

路数越多,树的高度越低,但是不能无限增加路数,那样B树会退化成有序数组。

B树主要用在文件系统的索引上,为什么不用红黑树或者有序数组做文件系统的索引呢?要知道,文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中。

如果一棵树无法一次性加载到内存中的话,B树多路存储的能力就显现出来了,这时候可以每次加载树的一个节点,接着慢慢往下找。

比如下图的有序数组,如果内存每次只能加载两个数,这么长的数组是无法一次性加载到内存中的

如果把上图的有序数组转换成一棵三路的B树,这样每个节点最多能存储2个数

这样,查找的时候一次只需要加载一个节点进内存就可以了

B树在磁盘的操作上较红黑树更有优势,而在内存中,红黑树比B树效率更高

【B+树】

B+树是在B树的继承上进行改造,它的数据都存储在叶子节点上,同时叶子节点之间还加了指针形成链表。下图是一棵四路B+树,它的数据都存储在叶子节点上,并且有链表相连

B+树的使用场景在数据库的索引上使用的比较多,这个也是跟业务系统有关的,使用数据库进行数据查找的时候,一般select查找的数据不止一条,有时候会有很多条检索结果,比如按照id排序后选10条。如果是多条的话,B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。比如选出7和19,只需要在叶子节点中就能找到

 

回到问题,为什么MySQL数据库要用B+树存储索引?

这和业务场景有关。如果只选一个数据,那确实是Hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比Hash就快很多了。而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。

 

转载于:https://www.cnblogs.com/lyc94620/p/10179579.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] rgba()和opacity这两个的透明效果有什么区别呢?

[css] rgba()和opacity这两个的透明效果有什么区别呢? 1.opacity 是属性,rgba()是函数,计算之后是个属性值; 2.opacity 作用于元素和元素的内容,内容会继承元素的透明度,取值0-1; 3.rgba() 一般…

lettuce 配置域名 dns 切换

大家好,我是烤鸭: 如果你也有类似的困扰,运维告诉你,redis连接配置域名,这样出问题了,直接改dns地址就行,不需要重启服务。。。梦想是美好的,现实是残酷的。如果你使用的是 let…

[css] 怎样修改chrome记住密码后自动填充表单的黄色背景?

[css] 怎样修改chrome记住密码后自动填充表单的黄色背景? input:-webkit-autofill { -webkit-box-shadow: 0 0 3px 100px #eee inset; //改变填充背景色 }个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢…

[css] 说说你对z-index的理解

[css] 说说你对z-index的理解 层叠 就是Z轴的方向的位置,值越大离屏幕前的你越近,反之亦然。可以为负数个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通…

zuul 1.x 和gateway性能对比

大家好,我是烤鸭: 今天分享下 zuul和gateway 网关压测。 环境: windows 10 jdk 8 压测工具: wrk jmeter 数据对比 场景是仅单独转发,接口 Thread.sleep(50) jmeter 12 线程,30s zuul&#xf…

[css] 在页面中的应该使用奇数还是偶数的字体?为什么呢?

[css] 在页面中的应该使用奇数还是偶数的字体?为什么呢? 常用偶数号字体,但奇数号字体也没关系,例如 知乎正文使用15px字体,豆瓣电影使用13px字体UI设计师导出的设计稿一般都是偶数号字体偶数字号容易和页面其他标签的其他属性形成比例关系Windows 自带的…

redisson 大量ping操作,导致 tps过高

大家好,我是烤鸭: 这个问题有点奇怪,新服务上线,redis tps居高不下,还都是ping命令。 环境: 服务 : 280台,redis集群:12主24从 问题 由于服务刚上线,还没…

关于-编码进阶

中国电脑的windows 的默认编码是gbk. "记事本"是gbk, 和windows的编码一样.linux 的默认编码是utf-8苹果OS的默认编码是utf-8.str 字符串在内部的默认编码是 unicode # 英文str: 表现形式alex内部编码: 字符串str-> unicodebytes:表新形式 balex      …

PMP 学习总结

大家好,我是烤鸭: PMP终于考过了。成绩出了一个月了,一直想写一篇总结但没下笔,主要原因最近有点忙(太懒了)。考试的内容是基于第6版的。 晒个证书 证书上没写等级,一般都宣称5A过(其实我是 4A1T过的)。 学习过程…

[css] 你有用过CSS预处理器吗?喜欢用哪个?原理是什么?

[css] 你有用过CSS预处理器吗?喜欢用哪个?原理是什么? 它能让你的CSS具备更加简洁、适应性更强、可读性更强、层级关系更加明显、更易于代码的维护等诸多好处。 CSS预处理器种类繁多,目前Sass、Less、用的比较多。 使用功能&…

处理器映射器(HandlerMapping)及处理器适配器(HandlerAdapter)详解(一)

非注解 处理器映射器 和 处理器适配器 处理器映射器&#xff1a; 第一种: BeanNameUrlHandlerMapping <!-- 配置Handler --> <bean id"userController1" name"/queryUsers.action" class"com.bjxb.ssm.controller.UserController" />…

Gateway Sentinel 做网关降级/流控,转发header和cookie

大家好&#xff0c;我是烤鸭&#xff1a; Springcloud Gateway 使用 Sentinel 流量控制。 环境 springcloud-gateway的网关应用&#xff0c;springboot的服务&#xff0c;nacos作为注册中心 sentinel-dashboard-1.8.2 最新版下载地址&#xff1a; https://github.com/aliba…

[css] 说说CSS的优先级是如何计算的?

[css] 说说CSS的优先级是如何计算的&#xff1f; 选择器种类严格来讲&#xff0c;选择器的种类可以分为三种&#xff1a;标签名选择器、类选择器和ID选择器。而所谓的后代选择器和群组选择器只不过是对前三种选择器的扩展应用。而 在标签内写入 style"" 的方式&…

django后台数据管理admin设置代码

新建admin用户 createsuperuser 设定好用户名&#xff0c;邮箱&#xff0c;密码 设置setting LANGUAGE_CODE zh-hansTIME_ZONE Asia/ShanghaiUSE_I18N TrueUSE_L10N TrueUSE_TZ False 在写好的users的app下修改admin.py # -*- coding: utf-8 -*- from __future__ import u…

rocketmq 初探(一)

大家好&#xff0c;我是烤鸭&#xff1a; 今天看下rocketmq。这篇主要是简单介绍下 rocketmq以及idea 本地调试 rocketmq。 项目架构 感兴趣的可以下载源码看下。 https://github.com/apache/rocketmq 项目结构图。 rocketmq-acl: acl 秘钥方式的鉴权&#xff0c;用在bro…

[css] 说说浏览器解析CSS选择器的过程?

[css] 说说浏览器解析CSS选择器的过程&#xff1f; 按照从上到下&#xff0c;从右到左的顺序解析。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

客户将数据库迁移上云的常用办法

下载网站:www.SyncNavigator.CN 客服QQ1793040---------------------------------------------------------- 关于HKROnline SyncNavigator 注册机价格的问题 HKROnline SyncNavigator 8.4.1 非破解版 注册机 授权激活教程 最近一直在研究数据库同步的问题&#xff0c;在网上…

基于nchan打造百万用户的聊天室

大家好&#xff0c;我是烤鸭&#xff1a; 这次介绍下nchan&#xff0c;nginx的一个module。 nchan 源码: https://github.com/slact/nchan 官网: https://nchan.io/ nginx 配置说明文档: https://nchan.io/documents/nginxconf2016-slides.pdf 测试环境搭建 4 台linux cent…

springboot 获取控制器参数的几种方式

这里介绍springboot 获取控制器参数有四种方式 1、无注解下获取参数 2、使用RequestParam获取参数 3、传递数组 4、通过URL传递参数 无注解下获取参数无注解下获取参数&#xff0c;需要控制器层参数与HTTP请求栏参数名称一致&#xff0c;这样后台就可以获取到请求栏的参数。 /*…

rocketmq 初探(二)

大家好&#xff0c;我是烤鸭&#xff1a; 上一篇简单介绍和rocketmq&#xff0c;这一篇看下源码之注册中心。 namesrv 先看两个初始化方法 NamesrvController.initialize() 和 NettyRemotingServer.start(); public boolean initialize() {// 加载配置文件this.kvConfigMana…