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的常用的引擎的 ...
随机推荐
- set serveroutput on
使用set serveroutput on 命令设置环境变量serveroutput为打开状态,从而使得pl/sql程序能够在SQL*plus中输出结果 使用函数dbms_output.put_lin ...
- Git Command之Code Review
原文链接 准备 Step 1. Create a team and add a teammate Step 2. Create a repository with some content 应用 Cl ...
- ehcache快速入门
前言 JAVA缓存实现方案有很多,最基本的自己使用Map去构建缓存,或者使用memcached或Redis,但是上述两种缓存框架都要搭建服务器,而Map自行构建的缓存可能没有很高的使用效率,那么我们可 ...
- 用python画函数图像
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 1, 50) # 从0到1,等分50分 y = 210*(x ...
- jQuery ajax表单提交
Jquery的$.ajax方法可以实现ajax调用,要设置url,post,参数等. 如果要提交现有Form需要写很多代码,何不直接将Form的提交直接转移到ajax中呢. 以前的处理方法 如Form ...
- Flutter 路由 页面间跳转和传参 返回
Navigator Navigator用来管理堆栈功能(即push和pop),在Flutter的情况下,当我们导航到另一个屏幕时,我们使用Navigator.push方法将新屏幕添加到堆栈的顶部.当然 ...
- Jmeter 逻辑控制器 之 Switch Controller
一.认识 Switch Controller Switch Controller:开关控制器,通过其下样例顺序数值或名称 控制执行某一个样例 二.通过样例顺序数值控制执行样例 三.通过样例名称控制 ...
- DOS & UNIX文件格式转换
1.使用vi编辑器 vi xxxx :set fileformat=unix(or dos) :wq 2.使用 dos2unix 这个只能把DOS转换成UNIX文件 . sudo apt-get in ...
- 【Fiori系列】为什么SAP Fiori活的如此精致
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]为什么SAP Fiori活的如 ...
- 如何快速在Github找到你想要的东西
众所周知 Github是全球最大的xx交友平台,虽然被收购了.但是不并没有什么影响. 使用Git可以做很多事,在这里不再缀述,上面的资源也是多种多样,应有尽有 对于这样一个平台,我们想快速找到自己需要 ...