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亿。

相关推荐
好奇龙猫5 分钟前
【大学院-筆記試験練習:线性代数和数据结构(9)】
数据结构·线性代数
heze0910 分钟前
sqli-labs-Less-13自动化注入方法
mysql·网络安全·自动化
JeffreyTaiT19 分钟前
根据binlog恢复SQL
前端·mysql
0和1的舞者25 分钟前
力扣hot100-链表专题-刷题笔记(一)
数据结构·链表·面试·刷题·知识
難釋懷27 分钟前
Redis数据结构介绍
数据结构·数据库·redis
哟哟耶耶37 分钟前
java-MySql下载与配置环境变量
java·开发语言·mysql
码农胖虎-java42 分钟前
【高频面试题】MySQL高频面试&实战:慢查询排查+索引底层(B+树/联合索引)全解析
b树·mysql·面试
Pluchon1 小时前
硅基计划4.0 算法 优先级队列
数据结构·算法·排序算法
漫随流水1 小时前
leetcode算法(257.二叉树的所有路径)
数据结构·算法·leetcode·二叉树
heartbeat..1 小时前
零基础学 SQL:IN、EXISTS、ON 用法详解(附示例 + 避坑)
java·数据库·sql·mysql