热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL索引为什么使用B+树?

前言有数据库基础的应该都了解数据库利用索引能达到一个快速寻找数据的效果。更深一点的可能了解到索引(InnoDB)是利用B+树去实现的。但是为什么要用B+树呢?这世上树那么多,为何独






前言

有数据库基础的应该都了解数据库利用索引能达到一个快速寻找数据的效果。

更深一点的可能了解到索引(InnoDB)是利用B+树去实现的。

但是为什么要用B+树呢?

这世上树那么多,为何独爱这一棵呢?

一切都源于一个网络’爱情故事’。


艾欧的故事

在城市居住的艾先生,通过网络认识了一个叫欧的女士. 通过几个月的了解,艾先生发现自己爱了这位欧女士,于是向欧女士表白。

欧女士说:”我住在硬盘镇,如果你能找到我,我就答应你”。

欧女士留下了一个地址(0X00000001)给欧先生。

欧先生乘坐高铁来到了硬盘镇,发现这里的房子长的都很像, 想找到欧女士有点困难。

不过好在下车的第一个地方就是0X0000001,但是里面只留下了一个盒子。

欧先生打开盒子后,发现里面有一张纸条写着 0X00000005 , 于是欧先生继续在硬盘镇找寻这个地址。

一段时间后终于找到了, 但是里面同样的还是只有一个盒子, 写着 0X00000099。

过了N段时间后,终于找到了这个地址,也成功的找到了欧女士。

于是艾先生带着欧女士回到了城市。

这个艾先生找寻欧女士花费的时间就是艾欧时间了,从一个盒子找到另一个盒子就是艾欧次数了。

可以看到想要快速的找到欧女士就要缩短寻找的次数。

所以,InnoDB在考虑数据结构时必然要考虑到IO次数的问题。


索引数据结构的选择

Hash

Hash结构等值搜索可以达到O(1)的效果, 但是光不支持范围搜索就毙掉了。


二叉树

树结构的数据在查找中,每一次查询子树都可以看作一次IO. 所以树的高度和IO次数是相等的。

但由于树的根节点一般都会放在内存,根节点不用耗费IO。

一般树高为3的树查询最多需要2次IO。



  • 二叉搜索树

特点是左边小于根节点,右边大于根节点,但是插入新数据不会使之旋转。

这也就导致了一个问题, 插入的数据连续时会退化成一个链表,任何搜索都是扫全表.



  • AVL搜索树

也叫强平衡二叉搜索树,特点左右子树的高度相差不能超过1.

这也就导致了它会频繁的发生旋转,影响写入的性能。



  • 红黑树

特点红色节点的子节点必须是黑色。

每个节点到子节点都必须经过相同的黑色点

这样可以保证不会旋转太频繁,但是树高是不可控的。


多叉树



  • B树

B树的特点是每个节点都会保存数据.

这样虽然不用再发生IO去加载数据,但是能记录的节点就少了。



  • B+树

B+树的特点是只有叶子节点会保存数据,这个特性能让树尽可能的记录更多的节点。

InnoDB给这个B+树加了’亿’点细节, 每个头尾节点都会记录下一个或者上一个节点的指针, 这样在做范围查询的时候就可以很完美的处理了。


总结

任何不考虑硬件特性的程序都是耍流氓。

可以看到InnoDB为了稳定IO次数选择了B+树,又为了范围搜索添加了指针。

下一篇将会继续讲述B+树到底如何存储索引数据的,如果觉得写的对你有帮助,劳烦一健三连呀。

本文图片来源工具 : 动态数据结构网址

PS: 关注个人公众号: “多边形战士”, 回复”mysql” 送你经典MySQL学习书籍。




推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
author-avatar
抬头看着海
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有