| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 关于B树和B+树以及数据库索引 -> 正文阅读 |
|
[数据结构与算法]关于B树和B+树以及数据库索引 |
关于B树和B+树以及数据库索引MySQL优化详解请点击了解红黑树请点击一.B树1.特点对于一个
如图是一个5阶B树,可以看到,根节点的关键字个数只有22一个,根据性质,根节点有两棵子树。对于非根节点,最少有5/2=2个关键字,最多有5-1=4个关键字 2.查找B树查找分为两个步骤
一般活跃B树的根节点是常驻内存的,其余节点位于磁盘 以上图为例
3.插入只需记住一句话即可: 满:一个m阶B树,每个节点最多有m-1个关键字,当大于m-1个关键字,该节点就满了 取中:就是取中间的那个关键字,奇数个关键字直接取中间,偶数个则随机取中间两个其中一个 向上分裂:以取中的那个关键字为准,关键字向上一级,两边分裂 示例1 现在有一颗5阶B树,插入了1,2,5,8,再插入一个元素10,该节点会满 示例2 如图,再插入一个关键字40,会满 取18向上一级,两边分裂 4.删除4.1 删除非终端关键字当被删除的关键字k不是终端节点时,可以用k的前驱或者后继节点k’来代替k,然后再删除k’,关键字k’必定在终端节点中,因此,删除非终端节点变成了删除终端节点! 删除80,先让其前驱78代替80,然后再根据规则删除终端节点78即可 4.2 删除终端关键字分为三种情况 4.2.1 无需改动删除后满足定义,也就是节点关键字个数大于等于m/2,直接删除即可 以5阶B树为例,如果某个节点删除关键字后,其关键字个数仍然大于等于2,不用做调整 删除3,该节点关键字个数为2,直接删除即可 4.2.2 兄弟够借其实逻辑很简单,仔细看下就明白了 兄弟够借:删除后关键字个数小于m/2,但兄弟节点关键字个数借你一个后,其仍满足大于等于m/2 方法:父子换位法 示例1 借右兄弟 删除12,只有9一个关键字了,不符合B树的特点了,但是其右兄弟有3个关键字,借一个出去还剩两个,仍然满足特点,也即兄弟够借 示例2 借左兄弟 删除9,不满足性质,但左兄弟够借 4.2.3 兄弟不够借兄弟不够借:删除后关键字个数小于m/2,兄弟节点关键字个数只有m/2个,无法借给你 方法:父子合并法 示例1 删除5,不满足B树性质,兄弟也无法借 示例2 删除5,兄弟都不够借
二.B+树
B+树查找、插入、删除与B树基本类似。不过在查找时,非叶节点的值等于给定值时,不会停止,而是直到找到叶节点上的关键字为止。所以,在B+树中,无论是否查找成功,每次查找都是一条从根节点到叶节点的路径 三.关于B+树的面试题1.为什么使用B+树不用B树?(1)B+树的磁盘读写代价更低 假设我们上图的主键是bigint类型,长度为8字节,InnoDB指针一般为6字节,那么主键+指针一共14节点,而一页有16k=16384字节,所以一页可以有16384/14=1170个主键+指针结构,那么一刻高度为2的B+树的叶子节点可以有1170个,实际开发中一条记录一般为1k,也就是说一页可以放16条数据,那么总共可以放1170*16=18720条记录,所以使用B+的存储能力还是挺强的,同理高度为3的B+树可以存放219024000条记录,所以高度为1-3的B+树就可以存放千万条记录 B树不管非叶子节点还是叶子结点,都会保存数据,这样导致非叶子节点能保存的指针变少,所以想要保存大量数据,只能增加树的高度,而在查询数据时, (2)查询稳定 B+树在查找时,非叶节点的值等于给定值时,不会停止,而是直到找到叶节点上的关键字为止。所以,在B+树中,无论是否查找成功,每次查找都是一条从根节点到叶节点的路径,导致每一个数据的查询效率相当 (3)适合范围查询 B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低 2.为什么使用B+树不用红黑树或者平衡树?1.红黑树常用于存储内存中的有序数据,不适合存储数据库表大数据 2.即使你找到了把红黑树存进硬盘的方法,红黑树查找一个节点最多要查logn层,每一层都是一个内存页,要启动logn次磁盘IO!!! 3.为了解决二叉树数据有序时出现的线性插入树太深问题,平衡树的深度会明显降低,虽然极大提高性能,但是当数据量很大时,树的深度依旧非常大,mysql读取时会消耗大量IO 3.为什么数据库要有主键?因为 InnoDB 表里面的数据必须要有一个 B+tree 的索引结构来组织、维护我们的整张表的所有数据,从而形成 .idb 文件 4.为什么推荐使用整型自增?首先整型的占用空间会比字符串小,而且在查找上比大小也会比字符串更快。字符串比大小的时候还要先转换成 ASCII 码再去比较。如果使用自增的话,在插入方面的效率也会提高 不使用自增,可能时不时会往 B+tree 的中间某一位置插入元素,当这个节点位置放满了的时候,节点就要进行分裂操作(效率低)再去维护,有可能树还要进行平衡,又是一个耗性能的操作 都用自增就会永远都往后面插入元素,这样索引节点分裂的概率就会小很多 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 11:47:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |