A:为什么MySQL数据库要用B+树存储索引?

Hash的查找速度为O(1),而树的查找速度为O(log2n),为什么不用Hash作为数据库的存储索引呢?

树的话,无非就是前中后序遍历、二叉树、二叉搜索树、平衡二叉树,更高级一点的有红黑树、B树、B+树。

【红黑树】

红黑树也是平衡树中的一种,它复杂的定义以及繁琐的规则无非就是为了保证树的平衡性。一棵红黑树可以保证平衡性,保持平衡性的目的无非就是降低树的高度,提高搜索效率,Java中的TreeSet就是基于红黑树实现的

【B树】

B树就是多路搜索树,B树的每个节点都可以拥有多余两个孩子节点,比如一棵M路的B树最多可能拥有M个孩子节点。如下图,是一棵三路的B树,每个节点组多拥有三个孩子节点,同样是一棵搜索树。

路数越多,树的高度越低,但是不能无限增加路数,那样B树会退化成有序数组。

B树主要用在文件系统的索引上,为什么不用红黑树或者有序数组做文件系统的索引呢?要知道,文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中。

如果一棵树无法一次性加载到内存中的话,B树多路存储的能力就显现出来了,这时候可以每次加载树的一个节点,接着慢慢往下找。

比如下图的有序数组,如果内存每次只能加载两个数,这么长的数组是无法一次性加载到内存中的

如果把上图的有序数组转换成一棵三路的B树,这样每个节点最多能存储2个数

这样,查找的时候一次只需要加载一个节点进内存就可以了

B树在磁盘的操作上较红黑树更有优势,而在内存中,红黑树比B树效率更高

【B+树】

B+树是在B树的继承上进行改造,它的数据都存储在叶子节点上,同时叶子节点之间还加了指针形成链表。下图是一棵四路B+树,它的数据都存储在叶子节点上,并且有链表相连

B+树的使用场景在数据库的索引上使用的比较多,这个也是跟业务系统有关的,使用数据库进行数据查找的时候,一般select查找的数据不止一条,有时候会有很多条检索结果,比如按照id排序后选10条。如果是多条的话,B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。比如选出7和19,只需要在叶子节点中就能找到

回到问题,为什么MySQL数据库要用B+树存储索引?

这和业务场景有关。如果只选一个数据,那确实是Hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比Hash就快很多了。而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。

转载于:https://www.cnblogs.com/lyc94620/p/10179579.html

为什么MySQL数据库要用B+树存储索引相关推荐

  1. 为什么MySQL数据库要用B+树存储索引?

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 话说两个多月前,小史通过了A厂的一面,两个多月后的今天,小史终于等到了A厂的二面. 简单 ...

  2. mysql存储base64位用什么类型_【漫画】面试现场:为什么MySQL数据库要用B+树存储索引?...

    推荐阅读:MySQL最全整理(面试题+笔记+导图),面试大厂不再被MySql难倒! 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 话说 ...

  3. 漫画 | 为什么 MySQL 数据库要用 B+ 树存储索引?

    作者 |  channingbreeze 责编 | 郭芮 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 话说两个多月前,小史通过了A厂 ...

  4. Mysql数据库查询好慢,除了索引,还能因为什么?

    mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题. 遇到这种问题,我们一般也会想到是因为索引. 那除开索引之外,还有哪些因素会导致数据库查询变慢呢? 有哪些操作,可 ...

  5. mysql数据库in函数查询是否走索引

    mysql数据库in函数查询是否走索引? IN 通常是走索引的,当IN后面的数据在数据表中超过30%的匹配时是全表的扫描,不会走索引,因此IN走不走索引与后面的数据量有关系! 昨天恰好在工作中遇到了这 ...

  6. ruhr启动mysql数据库_Mysql表类型(存储引擎)的选择

    以下内容转载自:https://www.cnblogs.com/jswang/p/6923911.html 7.1 mysql存储引擎概述 插件式存储引擎是mysql数据库最重要的特性之一,用户可以根 ...

  7. 将owl本体文件存储到mysql数据库_OWL本体文件如何存储到数据库

    手掌心 安装好必要的软件并配置好开发环境EclipseMySQL Server 5.5-win32jena2.6.4protege4.3mysql-connector-java-5.1.35(MySQ ...

  8. Python封装函数实现MySQL数据库增删改和数据存储

    目录 一.背景介绍 二.封装数据库访问函数 (1)封装数据库连接函数dbconnect (2)封装SQL查询函数SQLQuery (3)封装SQL命令函数SQLCommand 三.主函数调用 1.定义 ...

  9. mysql数据库sql优化看这里之索引优化

    前面我们讲了如何创建索引以及哪些情况下该创建索引.现在我们来说一下sql优化中的索引如何优化. 首先我们需要了解都有哪些纬度可以进行数据库调优: ①索引失效,没有充分利用到索引--索引建立 ②关联查询 ...

最新文章

  1. python3:利用SMTP协议发送QQ邮件+附件
  2. Measuring Similarity between Clusters (Clusters 之间相似度的测量)【未完待续】
  3. php 生成器 教程,PHP扩展生成器_PHP教程
  4. Win10 + Opencv2.4.9
  5. 20 个强大的 Sublime Text 插件
  6. 个人Typech情侣主题Cupid模板
  7. 案例:使用XPath的的爬虫
  8. 矩阵运算和一些基本的几何运算
  9. System学习笔记004---Windows系统中hosts文件的作用_Zookeeper在SpringBoot中报错需要配置一下这个文件
  10. 【路径规划】基于matlab A_star算法机器人栅格地图路径规划【含Matlab源码 116期】
  11. Palindrome Number之Java实现
  12. html静态页面作跳转
  13. [算法]数组排序之后相邻数的最大差值
  14. 御剑后台扫描工具下载
  15. C#Winform中运用DevExpress提供的ChartControl控件绘制多条曲线图
  16. linux漏洞抓鸡,风靡全球的Ms08-067漏洞抓鸡大曝光
  17. 使用TextToSpeech朗读文字
  18. MinDoc v0.4 发布 轻量级文档在线管理系统
  19. html css做一个简历表,HTML table制做我的简历
  20. AI_Cousera笔记(吴恩达)_开篇

热门文章

  1. python参数传递时不构造新数据对象_关于函数的参数传递(parameter passing),以下选项中描述错误的是_学小易找答案...
  2. ubuntu 下 php 安装 zip
  3. Mac 运行 psql postgres 报错
  4. 【51单片机快速入门指南】5.1:SPI与DS1302时钟芯片
  5. 【AVR ASF4库函数学习笔记】二、GPIO
  6. Linux 系统应用编程——网络编程(基础篇)
  7. 【Visual C++】游戏开发笔记十九 DirectX与OpenGL的博弈
  8. python 数据库模块
  9. js计算浮点数出现小数;解决js计算小数问题;js数组相加出现小数;
  10. [react] 写例子说明React如何在JSX中实现for循环