b树

MongoDB 使用B树

你说的曾经没有我的故事 提交于 2020-02-10 18:13:49
概述 MongoDB 是一个通用的、面向文档的分布式数据库[^1],这是官方对 MongoDB 介绍。区别于传统的关系型数据库 MySQL、Oracle 和 SQL Server,MongoDB 最重要的一个特点就是 『面向文档』 ,由于数据存储方式的不同,对外提供的接口不再是被大家熟知的 SQL,所以被划分成了 NoSQL,NoSQL 是相对 SQL 而言的,很多我们耳熟能详的存储系统都被划分成了 NoSQL,例如:Redis、DynamoDB[^2] 和 Elasticsearch 等。 NoSQL 经常被理解成没有 SQL(Non-SQL)或者非关系型(Non-Relational)[^3],不过也有人将其理解成不只是 SQL(Not Only SQL)[^4],深挖这个词的含义和起源可能没有太多意义,这种二次解读很多时候都是为营销服务的,我们只需要知道 MongoDB 对数据的存储方式与传统的关系型数据库完全不同。 MongoDB 的架构与 MySQL 非常类似,它们底层都使用了可插拔的存储引擎以满足用户的不同需求,用户可以根据数据特征选择不同的存储引擎,最新版本的 MongoDB 使用了 WiredTiger 作为默认的存储引擎[^5]。 作为 MongoDB 默认的存储引擎,WiredTiger 使用 B 树作为索引底层的数据结构,但是除了 B 树之外,它还支持 LSM

Mysql索引那些事情

冷暖自知 提交于 2020-02-09 03:22:20
什么是索引? 索引在搜索引擎优化简单解释 指已经被收录且参与关键词排名的页面。 索引的通俗解释 索引就像是图书的目录,根据目录中的页码快速找到所需内容。 索引在百度百科中的解释 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 MySQL官方对索引的定义为: 索引(Index)是帮助MySQL高效获取数据的数据结构。我们可以简单理解为:**快速查找排好序的一种数据结构。**Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引) 有哪些索引算法 hash算法 什么是hash 如果有编程经验的小伙伴都知道不管是哪种语言都是有hash实现,简单来说就是一个 key 通过一个 hash(key) 算法后得到一个固定长度值,可以通过这个计算后的值与存放数据容器长度取模后的值做索引,快速定位元素( 可以看作类似数组索引 ),查询时间复杂度为O(1),在java里面一个对象可以重写hashCode()方法。 hash数据结构 存在问题 只支持等值索引定位 hash算法虽然能快速定位元素位置,时间复杂度O(1)查询速度是相当可观的, but 这个作为 mysql

浅谈B和B+树

二次信任 提交于 2020-02-05 02:35:38
B树 也叫 B-树 用途:用于少部分数据库和mongdb索引 索引:如果我们去查询某的字段等于某个值的数据,我们要去遍历所有数据才能得出,但是我们如果建立了索引,也就是对某个字段建立了索引,我们就可以高效的直接查找出对应值的数据在哪里了,底层用B,B+树实现 B树的特性: 待补 为什么需要B树? 其实就一般自己来说二叉搜索树的效率要高于B树,比较次数比B树少,但是一个重要的问题磁盘IO,因为如果对于海量数据的话,建立起来的索引也是非常大的,我们只能一次加载一个对应的磁盘页进来,这里也对应这一个节点的数据,因为从磁盘中读取数据这个操作的时间远远的要比内存中比较长,所以我们可以牺牲多次比较来减少磁盘IO,也就是让建立出来的树尽量的矮胖,B树也叫多路平衡查找树,二叉搜索树其实也可以叫二阶B树,B树的阶数主要看分叉的数量,节点内的关键字是阶数-1 例子:待补 B树的三大操作 查找,插入,删除 查找 查找的话和二叉搜索树的原理一样的 例子:待补 插入 首先我们直接找到那个对应的节点,然后插入,因为每个节点只能存放m阶-1个关键字,如果到了m就要分裂节点 分裂节点:左边一半当左节点,右边一半当右节点,中间一个升入父节点,如果父节点出现类似情况也要分裂 例子:待补 删除 每个节点存放的关键字必须是一半 有三种情况 1,如果删除的那个节点的关键字删除一个后还有一半,那就直接删 2,如果删除后

Mysql 索引

好久不见. 提交于 2020-02-05 02:07:38
一. 存储引擎 1. 什么是存储引擎? 与其他数据库例如Oracle 和SQL Server等数据库中只有一种存储引擎不同的是,MySQL有一个被称为“Pluggable Storage Engine Architecture”(可替换存储引擎架构)的特性,也就意味着MySQL数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。MySQL数据库在实际的工作中其实分为了语句分析层和存储引擎层,其中语句分析层就主要负责与客户端完成连接并且事先分析出SQL语句的内容和功能,而存储引擎层则主要负责接收来自语句分析层的分析结果,完成相应的数据输入输出和文件操作。简而言之,就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。 2. 存储引擎种类 存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不再默认安装 MRG_MyISAM(MERGE) 将多个表联合成一个表使用,在超大规模数据存储时很有用 Memory 内存存储引擎

聚集索引与非聚集索引

这一生的挚爱 提交于 2020-02-02 07:49:22
非聚集索引也是堆结构?其实 SQLSERVER 有几种页面类型(数据都使用一页一页来存储,就像 Windows 的内存也是使用页面来组织的)感兴趣的朋友可以了解下,希望本文可以增加你们对非聚集索引结构的理解。 我们知道 SQLSERVER 的数据行的存储有两种数据结构: A :堆 B : B 树( binary 二叉树)。数据按照这种两种的其中一种来排序和存储,学过数据结构的朋友应该知道二叉树,为什麽用二叉树,因为方便用二分查找法来快速找到数据。堆的数据是不按照任何顺序排序的,也没有任何结构,数据页面也不是首尾相连的。不像 B 树,数据页面使用双向链表首尾相连。堆表只依靠表里的 IAM 页(索引分配映射页)将堆的页面联系在一起, IAM 里记录了页面编号,页面位置除非表里有聚集索引,如果没有的话那么表里的数据的存储就是堆结构。 那么非聚集索引呢 ? 非聚集索引也是堆结构?其实 SQLSERVER 有几种页面类型(数据都使用一页一页来存储,就像 Windows 的内存也是使用页面来组织的) 其中有一种是索引页,一种是数据页。 我感觉很多书都说不清,就像我一样,在文章的开头也是这样说的:数据行的存储有两种数据结构: A :堆 B : B 树(二叉树) 我觉得应该是数据页面的存储有两种数据结构: 1 、堆 2 、 B 树 先说一下:索引页,不管是聚集索引还是非聚集索引

【我是一棵树】B树、B+树

只愿长相守 提交于 2020-02-02 05:19:01
多路查找树(B树) 其每个节点的孩子数可以多于两个,且每一个节点处可以存储多个元素。 2-3树 其中每个节点都具有两个孩子(我们称它为2节点)或者3个孩子(3节点)。 2-3-4树 就是2-3树点的扩展,包括了4个节点的使用 B树 是一种平衡的多路查找树,节点最大的孩子数目称为B树的阶。 属性 1、如果根节点不是叶节点,则起至少有两棵子树。 2、每一个非根的分支节点都有k-1个元素和k个孩子,其中【m/2】<=k<=m(【x】为向下取整),每一个叶子节点n都有k-1个元素 3、所有叶子节点都位于统一层次。 4、所有分支节点包含下列信息数据,(A0K1,A1K2,...KmAn),其中Ki为关键字,且Ki<K(i+1);Ai为指向子树根节点的指针,且指针A(i-1)所指子树中所有节点的关键字均小于Ki,An所指子树中所有节点的关键字均大于Kn。 B+树定义 B+树已经不是严格意义上的树了,在B树中每个元素只能出现一次,B+树中出现在分支节点的元素会被当做他们在该分支节点位置的中序后继者(叶子节点)中再次列出。另外,每个叶子节点都会保存一个指向后一叶子节点的指针。 B树和B+树的差异 1、有n棵子树的节点中包含有n个关键字 2、所有叶子节点包含全部关键字信息及向含这些关键字记录的指针,叶子节点本身依关键字点的大小字小而大顺序链接。 所有分支接二店可以看成是索引,节点中仅含其子树中最大

多叉树,B树,B+树

假装没事ソ 提交于 2020-02-01 12:51:49
B树的介绍 B-tree树即B树,B即Balanced,表示平衡。有人把B-tree翻译成B-树,容易让人产生误解。会认为B-树是一种树,而B树又是另一种树。实际上,B-tree就是指的B树。 B+树的介绍 B+树是B树的变体,也是一种多路搜索树 来源: https://www.cnblogs.com/yangzhixue/p/12247978.html

B树和B+树的总结

旧巷老猫 提交于 2020-01-29 08:56:09
B树和B+树总结 B树 简介 这里的B树,也就是英文中的B-Tree,一个 m 阶的B树满足以下条件: 每个结点至多拥有m棵子树; 根结点至少拥有两颗子树(存在子树的情况下),根结点至少有一个关键字; 除了根结点以外,其余每个分支结点至少拥有 m/2 棵子树; 所有的叶结点都在同一层上,B树的叶子结点可以看成是一种外部节点,不包含任何信息; 有 k 棵子树的分支结点则存在 k-1 个关键码,关键码按照递增次序进行排列; 关键字数量需要满足ceil(m/2)-1 <= n <= m-1; 举个栗子: 为什么要B树 磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行优化,提高磁盘读取时定位的效率。 为什么B类树可以进行优化呢?我们可以根据B类树的特点,构造一个多阶的B类树,然后在尽量多的在结点上存储相关的信息,保证层数尽量的少,在B树中可以检查多个子结点,由于在一棵树中检查任意一个结点都需要一次磁盘访问,所以B树避免了大量的磁盘访问;而且B类树是平衡树

B树插入删除操作

十年热恋 提交于 2020-01-27 06:57:00
B-树定义: 一种平衡的 多路 查找树。 用于:索引组织文件,减少访问 外存 次数,节约搜索时间。 一棵m阶B-树或为空树,或满足下列特性:(为尽量简单,把考试不考的内容全部略去) 1、树中每个结点至多有m个分支,最少有[m/2]分支,取上整,除根结点外; 2.关键字数大于等于m/2-1,小于等于m-1,/2取上整 3、如果树的结点数大于1,则根结点至少两分支 例4阶B-树,来自zzh的ppt 插入操作 (1)若该结点的关键字个数<m-1 直接在最底层插入 (2)若该结点的关键字个数=m-1 此种情况m-1+1=m溢出,把出问题的那一分支的中间结点插入到父结点中,如果父结点也溢出,递归解决,显然树高可能因此增加一层,举个例子最形象! 删除结点 三种情况 (1)被删关键字所在结点中的 关键字 个数>=[m/2],说明 删去该关键字后该结点仍满足B-树的定义。 直接删去关键字即可。 (2)被删关键字所在结点中关键字个数n=[m/2]-1,说明删去该关键字后该结点将不满足B-树的定义,需要调整。 ①如果其左(右)兄弟结点中有“多余”的关键字,即与该结点相邻的右(左)兄弟结点中的 关键字 数目 大于[m/2]-1 。 则可将右(左)兄弟结点中最小(大)关键字上移至双亲结点。而将双亲结点中小(大)于该上移关键字的最大(小)关键字下 移至被删 关键 字所在结点中。

B树概念理解(学习笔记)

不羁的心 提交于 2020-01-21 22:27:34
B树概念理解(学习笔记) (1)AVL树已经能够较大程度减少树的深度,但是希望有更少的磁盘I/O次数,磁盘I/O代价非常昂贵,并且CPU速度的增长远快于磁盘速度的增长,从而引入了B树。 (2)推荐查看我的上一篇博客(https://blog.csdn.net/weixin_42111859/article/details/104022444),里面有关于AVL树的理解过程 1.m叉树 (1)度为m的树第i层上最多有pow(m,i-1)个节点 (2)节点数=节点度之和+1(可以将节点度看成出边,除了根节点之外,每个节点都被一条出边所指向,出边为有向图中的概念) (3)高度为h的m叉树节点数最多为(pow(m,h)-1)/(m-1) (通过等比数列求和可以得到) (4)具有n个节点的m叉树最小高度h=ceil( log( m,n(m-1) )+1 ) (ceil表示向上取整) 我证明一下二叉树情况,m叉树只是一个简单的扩展: 2.B树 子树和关键字:若节点有k个关键字,关键字是递增排序的,那么一定有k+1颗子树,子树限定的是范围,这就相当于x轴上有k的点,由它们可以分割出k+1个范围。即n(关键字)=n(子树)-1 (1)B树满足的条件 首先是一颗m叉树 除了根节点以外所有非叶节点最少有ceil(m/2)棵子树(ceil表示向上取整) 如果根节点不是唯一节点,那么它至少有2棵子树