为什么MySQL用B+树做索引而不使用其他的数据结构呢?

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 为什么MySQL用B+树做索引而不使用其他的数据结构呢?

为什么不用数组?

数组这个数据结构,对于我们来说算是最熟悉的老朋友了,自从JAVASE时我们就接触它,对于一个有序数组,我们进行查找和修改操作效率是非常高的,并且在不考虑空洞的情况下删除操作也非常快,因为只需要将此处元素置为null,但如果我们要在数组中间的任意一个位置插入一个数据,那么必然会引起该位置后面所有数据位置的变化,也就是涉及到了数组的复制,而插入的位置越往前,所需要复制的数据就越多,该过程不仅需要消耗大量的内存,而且还会浪费大量的时间,因此从插入数据的场景来看,数组并不适合作为MySQL索引的数据结构!

为什么不用哈希表?

在MySQL中我们经常需要查找某个范围内的数据,例如between…and,>=,<=等,由于哈希表所有的key都会先经过哈希函数计算,再将数据存放到对应的位置,本来可能有序的key通过哈希函数计算之后导致其存放不有序了,因此如果我们在哈希表中进行范围查找,只能通过遍历的方式,当数据量过大的情况下,对于哈希表的整个遍历是非常耗时的。


因此从范围查询的场景来看,哈希表也不太适合作为MySQL索引的数据结构,它适合等值查询,例如我们常用的redis数据库都是key-value的形式且无序。

为什么不用二叉树?

我们最常用的二叉树有二叉搜索树,平衡树,红黑树。


无论是二叉搜索树,平衡树还是红黑树,他们的特点都是每个节点最多只有两个子节点,如果存储大量数据的话,那么树的高度就会非常高,而MySQL存储的数据最终是要到磁盘的,MySQL应用程序读取数据时,需要将数据先从磁盘加载到内存后才能继续操作,所以这中间会发生磁盘IO,而如果树的高度太高,每遍历一层结点时,就需要从磁盘读取一次数据,也就是发生一次 IO,假设数据在树高为 20 的地方,那查找一次数据就得发生 20 次 IO,耗时太长了。


因此二叉树在 MySQL 这种需要存储大量数据的场景下,是不适合当做索引的数据结构的,因为树太高,操作数据时会发生多次磁盘 IO,性能太差。

为什么使用B+Tree?

既然二叉树因为每个结点最多只有两个子结点,最终在存储大量数据时导致树太高,那么让树的每个结点尽可能多的拥有多个子结点,也就是多叉树,这样在大量储存数据时,树就低很多了,能够实现该功能的数据结构正是多叉树中典型B-Tree 和 B+Tree。


B-Tree 的特点是无论叶子结点还是非叶子结点,它都存有索引值和数据;B+Tree 的特点是只有叶子结点才会存放索引值和数据,非叶子结点只会存放索引值本身。由于一个结点的空间是有限的,B-Tree 要存放索引+数据,而 B+Tree 只需要存放索引,因此对于非叶子结点,一个结点中,B+Tree 存放的索引值数量会远远大于 B-Tree,这样就导致了每个结点中,B+Tree 能向下分出更多的叉,子结点数更多。


那么在存储同样大小数据的场景下,用 B+Tree 存储,最终树的高度会远远小于用 B-Tree 存储的高度,所以使用 B+Tree 作为 MySQL 索引的数据结构,在读取数据时,发生的磁盘 IO 次数会更少,性能更优,因此最终 MySQL 索引的数据结构使用的是 B+Tree。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
573 0
|
7月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
7月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
215 4
|
9月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
7月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
176 2
|
8月前
|
存储 关系型数据库 MySQL
MySQL覆盖索引解释
总之,覆盖索引就像是图书馆中那些使得搜索变得极为迅速和简单的工具,一旦正确使用,就会让你的数据库查询飞快而轻便。让数据检索就像是读者在图书目录中以最快速度找到所需信息一样简便。这样的效率和速度,让覆盖索引成为数据库优化师傅们手中的尚方宝剑,既能够提升性能,又能够保持系统的整洁高效。
226 9
|
9月前
|
机器学习/深度学习 关系型数据库 MySQL
对比MySQL全文索引与常规索引的互异性
现在,你或许明白了这两种索引的差异,但任何技术决策都不应仅仅基于理论之上。你可以创建你的数据库实验环境,尝试不同类型的索引,看看它们如何影响性能,感受它们真实的力量。只有这样,你才能熟悉它们,掌握什么时候使用全文索引,什么时候使用常规索引,以适应复杂多变的业务需求。
232 12
|
5月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
433 158
|
5月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
5月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
992 152

热门文章

最新文章

推荐镜像

更多