注意B-树就是B树,-只是一个符号.

简介

B/B+树是为了磁盘或其它存储设备而设计的一种平衡多路查找树(相对于二叉,B树每个内节点有多个分支),与红黑树相比,在相同的的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度(在下面B/B+树的性能分析中会提到).B/B+树上操作的时间通常由存取磁盘的时间和CPU计算时间这两部分构成,而CPU的速度非常快,所以B树的操作效率取决于访问磁盘的次数,关键字总数相同的情况下B树的高度越小,磁盘I/O所花的时间越少.
B树中所有结点的孩子结点数的最大值称为B树的阶,通常用m表示。
一棵m叉树的性质如下:
树中每个结点至多有m棵子树(即至多含有m-1个关键字)
若根结点不是终端结点,则至少有两棵子树
除根结点以外的所有非叶子结点至少有[m/2](向上取整)棵子树(即至少含有[m/2]-1个关键字)
所有非叶子结点的关键字:K[1], K[2], …, K[m-1];且K[i] < K[i+1];
非叶子结点的指针:P[1], P[2], …, P[m];其中P[1]指向关键字小于K[1]的子树,P[m]指向关键字大于K[m-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
所有叶子结点位于同一层;

这里只是一个简单的B树,在实际中B树节点中关键字很多的.上面的图中比如35节点,35代表一个key(索引),而小黑块代表的是这个key所指向的内容在内存中实际的存储位置.是一个指针。

B+树

B+树是应文件系统所需而产生的一种B树的变形树(文件的目录一级一级索引,只有最底层的叶子节点(文件)保存数据.),非叶子节点只保存索引,不保存实际的数据,数据都保存在叶子节点中.这不就是文件系统文件的查找吗?我们就举个文件查找的例子:有3个文件夹,a,b,c, a包含b,b包含c,一个文件yang.c, a,b,c就是索引(存储在非叶子节点), a,b,c只是要找到的yang.c的key,而实际的数据yang.c存储在叶子节点上.
所有的非叶子节点都可以看成索引部分,这里就不详细介绍了

但为什么数据库大部分都采用B树呢?

当数据量很大的时候,磁盘的I/O速度是远远比不上内存的读写的。B-Tree的查询效率好像也并不比平衡二叉树高,但查询所经过的结点数量要少很多,也就意味着要少很多次的磁盘IO,这对
性能的提升是很大的。

操作系统从磁盘读取数据到内存是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理: 当一个数据被用到时,其附近的数据也通常会马上被使用。对于B树来讲,一个结点包含多个数据,比如从磁盘读取时读取一个结点的信息,包含多个数据中有就有目标数据,就不用再次进行IO读取了

附一篇mysql索引更详细的讲解

https://blog.csdn.net/weixin_42181824/article/details/82261988

数据库底层索引为什么用B树的更多相关文章

  1. 数据库常见索引解析(B树,B-树,B+树,B*树,位图索引,Hash索引)

    B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...

  2. 数据库索引B-树和B+树

    一开始学习数据结构的时候,主要学习的是数组,队列,链表,队列,栈,树这些数据结构,其中树主要学习二叉树,平衡二叉树,二叉搜索树等这些子节点最多只有两个的树结构.但是,当我们接触数据库的时候,你会发现数 ...

  3. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  4. 数据库——MySQL——索引——索引原理及B+树

    索引原理 我们使用索引,就是为了提高查询的效率,如同查书一样,先找到章,再找到章中对于的小节,再找到具体的页码,再到我们需要的内容. 事实上索引的本质就是不断缩小获取数据的筛选范围,找出我们想要的结果 ...

  5. MySQL数据库中索引的数据结构是什么?(B树和B+树的区别)

    B树(又叫平衡多路查找树) 注意B-树就是B树,-只是一个符号. B树的性质(一颗M阶B树的特性如下) 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3 ...

  6. B树和B+树对比,为什么MySQL数据库索引选择使用B+树?

    一 基础知识 二叉树 根节点,第一层的节点 叶子节点,没有子节点的节点. 非叶子节点,有子节点的节点,根节点也是非叶子节点. B树 B树的节点为关键字和相应的数据(索引等) B+树 B+树是B树的一个 ...

  7. Mysql数据库建立索引的优缺点有哪些?

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 什么是索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 例如这样一个查询:select * ...

  8. MySQL数据库对象-索引

    1. 概述2. 索引分类2.1 不同索引的概念2.1.1 普通索引2.1.2 唯一索引2.1.3 全文索引2.1.4 多列索引3. 索引操作3.1 普通索引3.1.1 创建表时创建普通索引3.1.2 ...

  9. 从数据库存储,文件结构谈到B树,散列

    昨天俱乐部内部办了一个讲座,关于常规数据库系统实现,听了之后有点混乱,于是花了很多时间特地查了一些资料,基本上自己感觉自己是明白了.特地写下来. 文章开头说明三点, 第一点,本文针对常规数据库,是为了 ...

随机推荐

  1. RMQ问题--ST

    #include<iostream> #include<cstdio> #include<cmath> using namespace std; ; ]; int ...

  2. DB2分页

    前言 最近在做一个DB2的项目,遇到分页处理的设计时开始犯难.以前一直采用MySQL作为项目数据库,其中的Limit关键字非常人性化,MySQL把分页的处理逻辑封装到了数据库的核心中,使得做查询设计时 ...

  3. 第24课.经典问题解析(1.析构函数的顺序;2.const修饰对象;3.成员函数,成员变量是否属于具体对象)

    1.当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 单个对象 单个对象创建时构造函数的调用顺序 a.调用父类的构造函数 b.调用成员变量的构造函数(调用顺序与声明顺序相同) c.调用类自身的 ...

  4. 33.TCP协议概念/scapy模块doos攻击

    TCP协议概念/scapy模块: 1,TCP/IP四层协议: 2,TCP数据包的构成: TCP FLAGS:TCP数据包标志位 U:URG,紧急比特 A:ACK,确认比特 P:PSH,推送比特 S:S ...

  5. [mysql] C++操作mysql方法

    下载:http://mirrors.sohu.com/mysql/MySQL-5.5/ From: http://www.cnblogs.com/magicsoar/p/3817518.html C+ ...

  6. 《鸟哥的Linux私房菜:基础学习篇》读书笔记之第一部分

    一.如何学习Linux 1. Linux基础知识 (1) 计算机概论与硬件相关知识. (2) 先从Linux的安装与命令学起. (3) Linux操作系统的基础技能.如用户/用户组.权限.程序等概念. ...

  7. java23种设计模式之七: 观察者模式

    一.应用背景     观察者模式又称为发布/订阅(Publish/Subscribe)模式,我们可以理解为:只有关注信公众号关注后才能收到信息 二.优.缺点 优点: 1.可以动态的改变对象的行为 缺点 ...

  8. 1.3.4 并发工具类CountDownLatch/Semaphore/CyclicBarrier/FutureTask

    CountDownLatch的2个用途: 1. 所有线程都到达相同的起跑线后,再一起开始跑(并非同时开始,而是队列中一个唤醒另一个)[此情况需到达起跑线后再调用await()等待其他线程] 2. 所有 ...

  9. 将neo4j的一个节点上的关系移动到另一个节点上

    将neo4j中一个节点的全部关系移动到另一个节点上面,采用先建立新关系,之后删除原先的关系的方式 def move_relations(source_node_id,target_node_id,gr ...

  10. (十三)mybatis 整合 ehcache

    目录 ehcache mybatis 的 Cache 接口 整合步骤 ehcache ehcache 是一个分布式缓存框架 ! 为什么需要分布式缓存? 在大型的项目中,服务器是肯定不止一台的,每台服务 ...