数据库为什么使用 B+ 树?

前言

讲到索引,第一反应肯定是能提高查询效率。例如书的目录,想要查找某一章节,会先从目录中定位。如果没有目录,那么就需要将所有内容都看一遍才能找到。

索引的设计对程序的性能至关重要,若索引太少,对查询性能受影响;而如果索引太多,则会影响增/改/删等的性能。

知识点

MySQL 中一般支持以下几种常见的索引:

B+树索引

全文索引

哈希索引

我们今天重点来讲下 B+树索引,以及为什么要用 B+树来作为索引的数据结构。

B+树索引并不能直接找到具体的行,只是找到被查找行所在的页,然后 DB 通过把整页读入内存,再在内存中查找。

1. 与二叉树相比

二叉树相比于顺序查找的确减少了查找次数,但是在最坏情况下,二叉树有可能退化为顺序查找。而且就二叉树本身来说,当数据库的数据量特别大时,其层数也将特别大。二叉树的高度一般是 log_2^n,B 树的高度是 log_t^((n+1)/2) + 1,其高度约比 B 树大 lgt 倍。n 是节点总数,t 是树的最小度数。

2. 与 B树相比

B 树在提高 IO 性能的同时,并没与解决元素遍历时效率低下的问题,正是为了解决这个问题,B+数应运而生。B+数只需遍历叶子节点即可实现整棵树的遍历,而 B 树必须使用中序遍历按序扫库,B+树支持范围查询非常方便。这才是数据库选用 B+树的主要原因。

另外,最后说一下,并不是说 B+树就比 B 树好,有很多基于频率的搜索是选用 B树,越频繁 query 的结点越往根上走,前提是需要对 query 做统计,而且要对 key做一些变化。

无论是 B 树还是 B+树由于前边几层反复 query,因此早已被加载入内存,不会出现读磁盘 IO。一般启动的时候,就会主动换入内存。在内存中 B+树并没有优势,只有在磁盘中 B+树的威力才能显现。

采用 B+ 树的索引结构优点:

B+树的高度一般为 2-4 层,所以查找记录时最多只需要 2-4 次 IO,相对二叉平衡树已经大

大降低了。

范围查找时,能通过叶子节点的指针获取数据。例如查找大于等于 3 的数据,当在叶子节点

中查到 3 时,通过 3 的尾指针便能获取所有数据,而不需要再像二叉树一样再获取到 3 的

父节点。

总结:

1)二叉查找树(BST):解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表

2)平衡二叉树(AVⅥL):通过旋转解决了平衡的问题,但是旋转操作效率太低

3)红黑树:通过舍弃严格的平衡和引入红黑节点,解决了 AⅥ旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO 次数太多

4)B 树:通过将二叉树改为多路平衡查找树,解决了树过高的问题

5)B+树:在 B 树的基础上,将非叶节点改造为不存储数据的纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。

mysql 索引 二叉树_MySQL 的索引,为什么是 B+而不是平衡二叉树相关推荐

  1. mysql 索引原理_MySQL InnoDB索引原理和算法

    也许你经常用MySQL,也会经常用索引,但是对索引的原理和高级功能却并不知道,我们在这里一起学习下. InnoDB存储索引 在数据库中,如果索引太多,应用程序的性能可能会受到影响:如果索引太少,又会对 ...

  2. mysql 字符串 底层_Mysql 的索引底层原理及数据结构详解

    Mysql 的索引底层原理 1.什么是索引? 索引是一种排好序的数据结构,mysql目前默认使用的是b+树. 2.为什么使用b+树? 例如表table 数据 id name 1 zs 2 ls 3 s ...

  3. mysql 堆表_Mysql聚集索引和非聚集索引(堆组织表和索引组织表)

    Mysql聚集索引和非聚集索引(堆组织表和索引组织表) 1.堆组织表(HOT)和索引组织表(IOT)有什么区别? myisam使用的堆组织表(Heap Organize Table, HOT),没有聚 ...

  4. mysql常见的索引类型_mysql 常用索引类型

    一.索引的类型 mysql索引的四种类型:主键索引.唯一索引.普通索引和全文索引.通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力.索引优化时mysql中的一种优化方式.索引的作 ...

  5. java中mysql数据库原理_MySql数据库索引原理

    本文主要是阐述索引机制,主要是说明存储引擎Innodb 第一部分主要从及理论层面讨论MySQL索引的数理基础. 第二部分结合MySQL数据库中InnoDB数据存储引擎中索引的实现讨论聚集索引.非聚集索 ...

  6. mysql 查看索引深度_mysql 学习 - 索引深度理解

    使用索引的代价 在熟悉了B+树索引原理之后,本篇文章的主题是唠叨如何更好的使用索引,虽然索引是个好东西,可不能乱建,在介绍如何更好的使用索引之前先要了解一下使用这玩意儿的代价,它在空间和时间上都会拖后 ...

  7. mysql 联合索引 性能_mysql:联合索引及优化

    命名规则:表名_字段名 1.需要加索引的字段,要在where条件中 2.数据量少的字段不需要加索引 3.如果where条件中是OR关系,加索引不起作用 4.符合最左原则 尽量不要用or,如果可以用un ...

  8. mysql的存储过程和索引区别_mysql查看索引与存储过程

    mysql查看索引与存储过程创建索引: CREATE INDEX可对表增加普通索引或UNIQUE唯一索引. CREATE INDEX index_name ON table_name (column_ ...

  9. mysql添加索引后查询先用索引吗_mysql 添加索引后 在查询的时候是mysql就自动从索引里面查询了。还是查询的时候有单 独的参数查询索引?...

    满意答案 llt1711 2014.06.20 采纳率:49%    等级:9 已帮助:614人 MYSQL创建索引对索引使用方式分两种: 1 由数据库查询优化器自动判断否使用索引: 2 用户写SQL ...

最新文章

  1. java severlet教程_javaweb-severlet
  2. python 装饰器 二 (装饰带参数的函数)
  3. Java设计模式(五):单例设计模式
  4. linux下tty, ttyn, pts, pty, ttySn, console理解
  5. 大厂与小厂工作的选择
  6. ERP技术的新方向——智能客户端
  7. maven仓库执行脚本(clearLastUpdated.bat)
  8. CMake,win10,64位,简单配置测试
  9. c#重点知识解答(五)
  10. 站立会议(11月23日
  11. 计算机操作系统第一章测试题及答案
  12. 曲线运动与万有引力公式_【知识总结】物理必修二曲线运动与万有引力相关公式和规律...
  13. 各地前端工资是多少?三线城市的前端有多少
  14. 【深度学习实验报告】实验 1:PyTorch 使用简介
  15. 常用的android脱壳工具,Android万能脱壳机
  16. LTM系统并联接入方式数据包交互分析
  17. 我的新书——《PHP程序员面试笔试宝典》
  18. 交叉编译工具的使用说明
  19. Devc++运行窗口中文乱码怎么办?
  20. 门德尔松 E小调小提琴协奏曲 个人赏析

热门文章

  1. python数据分析基础 余本国_Python数据分析基础
  2. 小程序实现瀑布流,获取图片高度分成两组数据的函数封装代码
  3. iOS直播(三)GPUImage音视频采集并写入文件
  4. 按照文字内容动态设置TableViewCell的高度
  5. 【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据
  6. VVeboTableView 源码解析
  7. Java面试题总结-Day4
  8. oracle 内存分配和调优 总结
  9. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法
  10. UnicodeDecodeError: ‘ascii’ codec can’t decode...: ordinal not in range(128 问题解决