Atitit btree 搜索原理

目录

第一节 左边小右边大 的有序树

第二节 平衡算法

第三节 层次高度一般3--4层

第四节 类似索引

第二章 Ref

  • 左边小右边大 的有序树

B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;

但B树在经过多次插入与删除后,有可能导致不同的结构:

右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题;

实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在B树中插入和删除结点的策略;

小结

B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;

B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;

所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;

Es的用的

倒排索引,是否真的比B-tree 索引更

当我们不需要支持「快速的更新」的时候,可以用「预先排序」等方式:

  • ElasticSearch:时间复杂度接近 O(1),采用「字典树 + 内存存储」

    • 倒排索引:有序的数据字典,根据 field 定位到数据,查找 field 时间复杂度也是 O(logN)
    • term-index:字典树结构 + 内存存储,快速定位到磁盘的 offset,定位到数据,时间复杂度接近 O(1),实际为 O(m),其中 m 为关键字的字符数量
  • MySQL: B+ 树结构存储,时间复杂度 O(logN)
    • B+树:按照 B+ 树结构存储,时间复杂度 O(logN),每次查询都可能经过多次「寻轨」,单次耗时 3~5 ms

,二叉树查找效率是logN,同时插入新的节点不必移动全部节点,所以用树型结构存储索引,能同时兼顾插入和查询的性能。

什么是倒排索引?

Alt text

继续上面的例子,假设有这么几条数据(为了简单,去掉about, interests这两个field):

ID

Name

Age

Sex

1

Kate

24

Female

2

John

24

Male

3

Bill

29

Male

ID是Elasticsearch自建的文档id,那么Elasticsearch建立的索引如下:

Name:

Term

Posting List

Kate

1

John

2

Bill

3

Age:

Term

Posting List

24

[1,2]

29

3

Sex:

Term

Posting List

Female

1

Male

[2,3]

Posting List

Elasticsearch分别为每个field都建立了一个倒排索引,Kate, John, 24, Female这些叫term,而[1,2]就是Posting List。Posting list就是一个int的数组,存储了所有符合某个term的文档id。

看到这里,不要认为就结束了,精彩的部分才刚开始…

通过posting list这种索引方式似乎可以很快进行查找,比如要找age=24的同学,爱回答问题的小明马上就举手回答:我知道,id是1,2的同学。但是,如果这里有上千万的记录呢?如果是想通过name来查找呢?

Term Dictionary

Elasticsearch为了能快速找到某个term,将所有的term排个序,二分法查找term,logN的查找效率,就像通过字典查找一样,这就是Term Dictionary。现在再看起来,似乎和传统数据库通过B-Tree的方式类似啊,为什么说比B-Tree的查询快呢?

ES索引原理 - 简书

笼统的来说,b-tree 索引是为写入优化的索引结构。所以当我们不需要支持快速的更新的时候,可以用预先排序等方式换取更小的存储空间,更快的检索速度等好处,其代价就是更新慢。要进一步深入的化,还是要看一下 Lucene 的倒排索引是怎么构成的。

  • Ref

BTree,B-Tree,B+Tree,B_Tree都是什么 - andyzhaojianhui的专栏 - CSDN博客.mhtml

Atitit btree 搜索原理 目录 第一节 左边小右边大 的有序树 1 第二节 平衡算法 1 第三节 层次高度一般3--4层 3 第四节 类似索引 3 第二章 Ref 5 第一节 左边小右相关推荐

  1. (笔记)Mac下耳机左右声道不平衡(左边小右边大或者右边大左边小)的解决方法

    1.打开System Preferences 2.点击Soud(声音) 3.把Balance的进度条拉到中间位置就OK啦!(Output volume是你当前耳机音量的大小)

  2. 数字图像处理笔记 第二章 数字图像基础 第一节 人眼视觉特性

    第二章 数字图像基础 第一节 人眼视觉特性 一.光与电磁波 可见光谱:380mm - 780mm 光谱图: 可见光范围内,不同波长的光给人不同的色彩感觉,不同强度的光及不同强度分布的光刺激人眼,在人脑 ...

  3. (王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)

    文章目录 一:什么是进程通信 二:如何实现进程间通信及其分类 三:通信方式1-共享存储(共享内存) (1)课本基础内容 (2)补充-Linux中的进程通信 四:通信方式2-管道 (1)管道是什么 (2 ...

  4. atitit 方便搜索的文档文章结构框架.docx 目录 1.1. 三种搜索模式 tree hash关键词模式 关联搜索,对应的三种索引 1 1.2. 好的标题规范与副标题 1 1.3. Tr

    atitit 方便搜索的文档文章结构框架.docx 目录 1.1. 三种搜索模式  tree  hash关键词模式  关联搜索,对应的三种索引 1 1.2. 好的标题规范与副标题 1 1.3. Tre ...

  5. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  6. 【Word/word2007】将标题第1章改成第一章

    问题:设置多级列表没有其他格式选的解决办法和带来的插入图注解的问题,将标题第1章改成第一章的问题其他方案. 按照百度搜索的方法设置第一章,可以是没有相应的样式可以选. 那就换到编号选项 设置新的编号值 ...

  7. 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走

    海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一 ...

  8. 第二章 第十六节:字典的循环嵌套

    Python基础入门(全套保姆级教程) 第二章 第十六节:字典的循环嵌套 字典的循环 直接看图看代码 dic = {"赵四": "特别能歪嘴","刘能 ...

  9. 猴子分桃的题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了 一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分 成五份,又多了一个,

    题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了 一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分 成五份,又多了一个,它同样把多的一个扔入海中 ...

  10. 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分为五份,又多了一个,它同样把多的一个扔入海......

    <script> //海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分为五份,又多了一个, ...

最新文章

  1. 2022-2028年中国电子陶瓷行业深度调研及投资前景预测报告
  2. 硬核!我的导师手写129页毕业论文,堪比打印!
  3. 三层交换不同VLAN间通信
  4. OpenCV下的灰度直方图生成及显示的源码,带详细注释
  5. 计算机网络---物理层
  6. html 父模板,详解vue父子模版嵌套案例
  7. python 列表 extend append_Python中list操作之append、extend
  8. SuperMap许可驱动安装流程详解
  9. mobi格式电子书_中英文电子书下载网站大搜罗
  10. c# 多线程单例模式_线程安全C#单例模式
  11. 英伟达驱动更新记录_英伟达更新驱动最好的方式 - 卡饭网
  12. Ubuntu 18安装腾达u12 无线网卡驱动
  13. EtherCAT网线选型标准
  14. java xheditor 上传图片_xheditor上传图片的java实现
  15. matlab 设计滤波器,FIR 滤波器设计
  16. Window系统64位下的x86文件夹
  17. qiao-get-ip:免费获取公网ip
  18. Linux系统配置(磁盘管理)
  19. 微信小程序 实现美团外卖 菜单分类,左右联动 效果
  20. 当Proteus 8 Professional运行程序的时候出现有些器件不可用

热门文章

  1. access ok linux,使用linux宏access_ok()有什么意义
  2. java date nov_Java DateTime格式为此
  3. php推荐位调用,推荐位数据循环调用
  4. oracle 修改sga参数,oracle 参数文件的修改,sga pga参数的修改
  5. C++中的L和_T()
  6. 原生体验挡不住!JavaScript开源跨平台框架NativeScript
  7. POJ训练计划3096_Surprising Strings(STL/map)
  8. iOS学习之WebView的使用
  9. GBin1分享:一个漂亮的jQuery页面内容导航插件 - Flexiable Nav
  10. SQL Injection***技术总汇(ASP+SQL Server版)v1.0