热门标签 | 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学习书籍。




推荐阅读
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • 本文详细介绍了如何在 MySQL 中授予和撤销用户权限。包括创建用户、赋予不同级别的权限(如表级、数据库级、服务器级)、使权限生效、查看用户权限以及撤销权限的方法。此外,还提供了常见错误及其解决方法。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文详细介绍了在XAMPP环境中如何修改Apache和MySQL的默认端口号,并确保WordPress能够正常访问。同时,提供了针对Go语言社区和Golang开发者的相关建议。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • Python Django大学生心理健康管理系统开发(含源码、文档)
    本项目包含完整的源代码、设计文档、数据库结构以及详细的安装指南,旨在为计算机专业的学生提供一个全面的心理健康管理系统解决方案。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • 在尝试从数据库获取设置的过程中,遇到了一个致命错误:Fatal error: Call to a member function bind_param() on boolean。本文将详细分析该错误的原因,并提供解决方案。 ... [详细]
  • 本文详细介绍了如何解压并安装MySQL集群压缩包,创建用户和组,初始化数据库,配置环境变量,并启动相关服务。此外,还提供了详细的命令行操作步骤和常见问题的解决方案。 ... [详细]
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社区 版权所有