数据库底层索引长啥样,你心里没点B树吗?

简介: 索引是对数据库值进行排序的一种存储结构,使用索引可提升数据库信息的访问效率,我们熟悉的MySQL采用B+树作为索引的底层存储结构,要知道MySQL采用B+树的原因,首先有必要介绍下树从二叉树到B树再到B+树的演变。

写在前面


索引是对数据库值进行排序的一种存储结构,使用索引可提升数据库信息的访问效率,我们熟悉的MySQL采用B+树作为索引的底层存储结构,要知道MySQL采用B+树的原因,首先有必要介绍下树从二叉树到B树再到B+树的演变。


二叉树


image.png

二叉树


B树


如图为M阶B树(M=4),从图中可以看出


1:根节点至少2个子节点。


2:每个节点key的数量为[M/2-1,M-1],即最多有3路,并且升序排列。


3:每个节点存储key和data。


4:所有叶子节点在同一层。


5:每个叶子节点指向的外部指针都为NULL。


image.png

4阶B树


B+树


如图为M阶B+树(M=4),从图中可以看出,与B树有所不同


1:非叶子节点不保存data,只保存索引。


2:某一节点有几个子节点,就有几个key。


3:所有key都在叶子节点出现。


4:所有叶子节点链接成一个有序的链表。


image.png

B+.png


从上面几张图可以看出,B树和B+树都是矮胖树,这对数据库索引结构的选择是非常重要的。


1:数据库为什么不选择二叉树?


二叉树的高度相比于B和B+树更高,高度越高,索引时IO次数越多,存取效率就会越低,所以不宜选做数据库的索引结构。


2:数据库为什么不选择B树,而选择B+树?


1:B+树每个叶子节点都有一个指向相邻叶子节点的指针。数据库的查询往往会有针对范围的查找,不可避免的需要遍历整棵树或者部分子树,B+树只需要遍历叶子节点就可以遍历整棵树,查询效率要远远高于B树。


2:非叶子节点不存储data,只存储key值,这样每个非叶子节点就可以存储更多的key,能读到内存中的key也就越多,内存操作的效率要远远高于磁盘I/O操作。


PS:关于索引的其他知识点记录一下。


聚簇索引(主键索引)


B+树的叶子节点存储的是完整的行数据。


二级索引(非主键索引)


叶子节点只存储了索引键值和主键值,如果查询字段包含索引以外的字段,则会根据主键回表查询。从mysql5.7开始,会先根据条件过滤掉部分行,再进行回表操作,这个过程叫做索引下推。


覆盖索引


如果使用普通索引,查询字段包含在索引字段中或者是主键,则不需要进行回表操作。

=

相关文章
|
3月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
100 4
|
4月前
|
存储 算法 关系型数据库
数据库主键与索引详解
本文介绍了主键与索引的核心特性及其区别。主键具有唯一标识、数量限制、存储类型和自动排序等特点,用于确保数据完整性和提升查询效率;而索引通过特殊数据结构(如B+树、哈希)优化查询速度,适用于不同场景。文章分析了主键与索引的优劣、适用场景及工作原理,并对比两者在唯一性、数量限制、功能定位等方面的差异,为数据库设计提供指导。
|
7月前
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因?
● B+树更便于遍历:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。 ● B+树的磁盘读写代价更低:B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。 ● B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条
|
10月前
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因?
B+树优化了数据存储和查询效率,数据仅存于叶子节点,便于区间查询和遍历,磁盘读写成本低,查询效率稳定,特别适合数据库索引及范围查询。
128 6
|
11月前
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因
B+树相较于B树,在数据存储、磁盘读写、查询效率及范围查询方面更具优势。数据仅存于叶子节点,便于高效遍历和区间查询;内部节点不含数据,提高缓存命中率;查询路径固定,效率稳定;特别适合数据库索引使用。
139 1
|
11月前
|
数据库 索引
数据库索引
数据库索引 1、索引:建立在表一列或多列的辅助对象,目的是加快访问表的数据。 2、索引的优点: (1)、创建唯一性索引,可以确保数据的唯一性; (2)、大大加快数据检索速度; (3)、加速表与表之间的连接; (4)、在查询过程中,使用优化隐藏器,提高系统性能。 3、索引的缺点: (1)、创建和维护索引需要耗费时间,随数据量增加而增加; (2)、索引占用物理空间; (3)、对表的数据进行增删改时,索引需要动态维护,降低了数据的维护速度。
160 2
|
11月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
1094 1
|
11月前
|
存储 关系型数据库 数据库
Postgres数据库BRIN索引介绍
BRIN索引是PostgreSQL提供的一种高效、轻量级的索引类型,特别适用于大规模、顺序数据的范围查询。通过存储数据块的摘要信息,BRIN索引在降低存储和维护成本的同时,提供了良好的查询性能。然而,其适用场景有限,不适合随机数据分布或频繁更新的场景。在选择索引类型时,需根据数据特性和查询需求进行权衡。希望本文对你理解和使用PostgreSQL的BRIN索引有所帮助。
318 0
|
11月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
977 0
|
28天前
|
安全 关系型数据库 MySQL
MySQL安全最佳实践:保护你的数据库
本文深入探讨了MySQL数据库的安全防护体系,涵盖认证安全、访问控制、网络安全、数据加密、审计监控、备份恢复、操作系统安全、应急响应等多个方面。通过具体配置示例,为企业提供了一套全面的安全实践方案,帮助强化数据库安全,防止数据泄露和未授权访问,保障企业数据资产安全。

热门文章

最新文章