B+Tree 索引结构

文章目录

    • [1. 数据库索引](#1. 数据库索引)
    • [2. B+Tree 索引结构](#2. B+Tree 索引结构)

1. 数据库索引

索引是为了提高数据的查询速度,相当于给数据进行编号,在查找数据的时候就可以通过编号快速找到对应的数据。索引用的是 B + Tree 数据结构。

乱序插入数据,会自动按照 id 进行升序排列,这是因为主键自带索引:

2. B+Tree 索引结构

数据存储的内部结构类似于链表的形式,通过指针关联不同的数据。第一位是索引,第二位是数据,第三位是后继指针(指向下一个节点)。

毕竟它类似于链表,当数据量很大的时候,这种结构的查询速度还是很慢的,那么 MySQL 是如何解决的呢?

MySQL 中有一个 page 的概念,相当于给数据进行分页,把一部分数据存入一个 page 中,先查 page 再查数据, 相当于一个分类管理。

每个 page 可以存储 16KB 的数据,这样就相当于给数据建立了上层目录,查找的时候先找大目录,再找具体的数据。

MYSQL 给 page 也提供了快速查询的目录,这样就可以清晰地知道你要查询的数据是在第几页,然后直接去第几页找就可以了。

多一层目录可提高数据查询的效率!

把每个 page 中的第一条数据的索引和后继指针取出来,放到 page 目录里面。 1P 第一页,3P 第二页,5P 第三页。

查询数据的时候,会先找到它的 page,而这个 page 到底是多少,要看 id 在哪个区间内,比如 id = 4 的数据就在第二页(因为 3 < id < 5)。找到 page 之后,再进入 page 中查找具体的数据。

这个目录也是有容量的,所以我们还会开启第二个、第 N 个 page 目录。一个 page 目录中也可以存储 16KB 的数据,如果是海量数据,page 目录也会有很多,这样查询起来也是比较慢的。

为了提高查询效率,MYSQL 就给 page 目录再加了一层目录。

同样的方法,依然是取出各 page 目录里面的第一项(索引和指针),存入更上层的目录中。

一般来说三层目录就足够了,要查找一个数据的时候,就从最上面一层一层分级查找,而这种结构就叫做 B+Tree!

假设一条记录的空间为 32 个 byte,那么最底层一个单元可以存储的数据为 16 * 1024 / 32 = 512 条;

第二层只需记录 id 和 p,假设是 6 个 byte,则一个单元可以保存的数据是 16 * 1024 / 6 = 2730 条;

第三层每个单元存储的数据和第二层一样是 2730 条。

所以总共可以存储的数据条数为三层数据相乘:512 * 2730 * 2730 = 38亿。

相关推荐
张张努力变强1 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
wWYy.1 小时前
数组快排 链表归并
数据结构·链表
斯普信专业组2 小时前
构建基于MCP的MySQL智能运维平台:从开源服务端到交互式AI助手
运维·mysql·开源·mcp
李斯啦果2 小时前
【PTA】L1-019 谁先倒
数据结构·算法
Exquisite.2 小时前
Mysql
数据库·mysql
·云扬·15 小时前
MySQL Binlog落盘机制深度解析:性能与安全性的平衡艺术
android·mysql·adb
霖霖总总15 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
それども17 小时前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql
·云扬·17 小时前
MySQL Binlog 配置指南与核心作用解析
数据库·mysql·adb
天空属于哈夫克317 小时前
Java 版:利用外部群 API 实现自动“技术开课”倒计时提醒
数据库·python·mysql