一图看懂B树和B+树数据存储区别到底在哪里【MySQL系列】

众所周知,MySQL存储引擎中底层索引数据存储结构用的是B+树,面试经常会被问到为什么MySQL选择用B+树作为索引存储结构,而不是B树或者其他结构。
首先,我们知道一般索引存储结构可以分为三种:哈希,B树和B+树。为什么MySQL选择了B+树,这就要根据三种数据结构的特性来分析其特点及优劣势。在讲存储结构之前,先理解一个概念,InnoDB存储引擎,每次搜寻数据,都会从磁盘中取出一定空间大小的数据(而不是每次只取一条数据),称之为页(Page),一般是16KB大小,也就是说InnoDB每次磁盘IO会取出16KB空间大小存储的数据;

哈希结构

哈希索引:将每行数据通过hash算法得到哈希code作为key存储,一般用于精确查找;
劣势:1.不支持范围查询;2.哈希冲突问题,需要设计良好的哈希算法;显然在生产环境中,很多时候都需要 支持范围查询,哈希索引明显不适用了;

B树结构

B树,多路平衡搜索树,B树即B-树。其存储特点是每个磁盘块上都会存储具体数据和指向下一磁盘块的指针。详情见下图,一个磁盘块16KB大小。这中存储方式看似满足要求,但是也不支持范围查询,并且还有一个很严重的问题,B树的存储结构不满足数据量过大的情况。这里我们做个简单的计算:每个磁盘块16KB大小,假设指针不占用空间,一条数据1KB,每个磁盘块16条数据,三层B树能存储16 * 16 * 16=4096条数据,一个磁盘块代表一次IO,很明显数据量多的情况下,IO次数也会多,会影响查询性能,于是在B树的基础上衍生出了B+树。

B+树

B+数的存储特点是叶子节点存储的是主键key或者是具体的数据,非叶子节点存储的是主键和指向下一页的指针,叶子节点之间又通过指针相连,形成双向链表结构。此时也做一个简单的数据计算:一个两层的B+树,一个页16KB,假设一条记录1KB,一个叶子节点最多存放16条记录,根节点存放的都是指针和主键,假设主键是8字节,InnoDB指针大小是6字节,一共14字节,根节点可以存放16 * 1024B/14,大概是1170条,存储的数据就是1170 * 16=18720条,那么同理三层B+树能支持18720 * 1170=21902400条数据(千万级别)。相比于B树,B+树能在IO次数相同的情况下存储更多的数据,同时由于叶子节点之间是双向链表形式,能支持范围插叙,因此MySQL选择了B+树作为索引结构
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值