6.B+Tree 检索原理
B+树的创建(索引的创建)
1.比如为phoneNum创建了一个索引,phoneNum这列保存了很多的手机号码
2.索引创建的过程中,会为这些数据进行适当的编码(根据这个数据所在的物理地址),如 3670 可能编成 66 这个号码
3.然后根据所有编成的号码,创建一些对比值,这些对比值实际上是不存在的,
4.将这些对比值作为根和支,编成的号码作为叶子,这些叶子节点都是一个一个的引用,指向了实际数据的物理地址
构成一颗多路径的树,可以是二叉,也可以是三、四叉
注:在和对比值比较的过程中,最后叶子节点的排列也是按照一定顺序的,如比它小,就排在左边,小就排在右边,所以索引是一种排好序的数据结构
5.将这棵树,以文件的方式存储在磁盘中
B+树的使用(索引的使用)
1.当使用的 sql语句用到了phoneNum时,这颗B树被加载到了内存中,此时我的查询条件比如说是 3670,
2.会使用 3670 对应的 编成的号码66,去查询这棵树,这样一层一层查下去,最终拿到66
3.拿到66之后,再去取出 3670
(66 这是一个引用,指向了 3670 对应的物理地址,)
树的高度决定了 io操作的次数,三层就会进行三次io操作,从磁盘中去读数据
B树和B+树区别:B+树是B树的一种变种
1.B树中同一键值不会出现多次,并且它有可能出现在叶结点,也有可能出现在非叶结点中。
而B+树的键一定会出现在叶结点中,并且有可能在非叶结点中也有可能重复出现,以维持B+树的平衡。
2.因为B树键位置不定,且在整个树结构中只出现一次,虽然可以节省存储空间,
但使得在插入、删除操作复杂度明显增加。B+树相比来说是一种较好的折中。
3.B树的查询效率与键在树中的位置有关,最大时间复杂度与B+树相同(在叶结点的时候),
最小时间复杂度为1(在根结点的时候)。而B+树的时候复杂度对某建成的树是固定的
事实上,在MySQL数据库中,诸多存储引擎使用的是B+树,即便其名字看上去是BTREE。Innodb和 Myisam 都是使用B+树来创建索引
6.B+Tree 检索原理的更多相关文章
- K-D TREE算法原理及实现
博客转载自:https://leileiluoluo.com/posts/kdtree-algorithm-and-implementation.html k-d tree即k-dimensional ...
- MYSQL之B+TREE索引原理
1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. 二叉树查找:(binary tree search): O( ...
- FP Tree算法原理总结(转载)
FP Tree算法原理总结 在Apriori算法原理总结中,我们对Apriori算法的原理做了总结.作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题 ...
- FP Tree算法原理总结
在Apriori算法原理总结中,我们对Apriori算法的原理做了总结.作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题,FP Tree算法(也称F ...
- 3.3 Lucene检索原理
Lucene是一个高效的,基于Java的全文检索库[1].所以在介绍Lucene的检索功能之前,我们要先了解一下全文检索以及Lucene的索引结构. 一.全文检索的基本原理 1. 数据的分类 什么是全 ...
- Influxdb原理详解
本文属于<InfluxDB系列教程>文章系列,该系列共包括以下 15 部分: InfluxDB学习之InfluxDB的安装和简介 InfluxDB学习之InfluxDB的基本概念 Infl ...
- 数据库MySQL 之 索引原理与慢查询优化
数据库MySQL 之 索引原理与慢查询优化 浏览目录 索引介绍方法类型 聚合索引辅助索引 测试索引 正确使用索引 组合索引 注意事项 查询计划 慢查询日志 大数据量分页优化 一.索引介绍方法类型 1. ...
- Merkle Tree 概念
Merkle Tree 概念 来源 https://www.cnblogs.com/fengzhiwu/p/5524324.html /*最近在看Ethereum,其中一个重要的概念是Merkle T ...
- Mysql的实现原理
上篇文章已经简单介绍了Mysql索引的基本介绍,这篇文章主要讲解一下所以的实现原理.索引的定义其实非常复杂,严格的定义需要用到关系代数的概念,不在咱们讨论范围内,这里咱们只讨论mysql的常用的引擎的 ...
随机推荐
- c++ string构造函数学习
#include <iostream>#include <string> using namespace std; int main(){ string a1; cout &l ...
- osg(openscenegraph).chm帮助文档
openscenegraph 3.6.3 链接:https://pan.baidu.com/s/1cQkiTPQx5MIIfxe5FTfjYw 提取码:7w4z openscenegraph 3.4 ...
- Android 中View的工作原理
Android中的View在Android的知识体系中扮演着重要的角色.简单来说,View就是Android在视觉的体现.我们所展现的页面就是Android提供的GUI库中控件的组合.但是当要求不能满 ...
- 【ARTS】01_29_左耳听风-201900527~201900602
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- dp[2019.5.25]
1.实例计算(写出计算过程): 1)对维数为序列<5, 10, 3, 12, 5, 50, 6>的各矩阵,找出其矩阵链乘积的一个最优加全部括号. 这是一个矩阵连乘问题,基本知识可以参考: ...
- QFramework 使用指南 2020 (一): 概述
大家好,我是 QFramework 的作者 凉鞋,QFramework 从第一次代码提交到现在快 5 年了,期间陆陆续续增加了很多功能,在使用体验上做了大量的改进. 而市面上关于 QFramework ...
- 最新 携程java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.携程等10家互联网公司的校招Offer,因为某些自身原因最终选择了携程.6.7月主要是做系统复习.项目复盘.LeetCode ...
- C#实现多线程的方式:Task——任务
简介 .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能. 在后台使用ThreadPool. 任务表示应完成的某个单元的工作. 这个单元的工作可以在单 ...
- codevs 3031:最富有的人
题目描述 Description 在你的面前有n堆金子,你只能取走其中的两堆,且总价值为这两堆金子的xor值,你想成为最富有的人,你就要有所选择. 输入描述 Input Description 第一行 ...
- 1-2-K Game
题目链接:https://vjudge.net/contest/330119#problem/E 题目大意可以理解为: 1.给出n个物品以及k,Alice与Bob轮流拿1个,或2个,或k个物品,Ali ...