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

相关推荐
孫治AllenSun35 分钟前
【Mysql】字段隐式转换对where条件和join关联条件的影响
数据库·mysql·oracle
熬了夜的程序员1 小时前
【华为机试】34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·华为od·华为·面试·golang
Doris_LMS2 小时前
保姆级别IDEA关联数据库方式、在IDEA中进行数据库的可视化操作(包含图解过程)
java·mysql·postgresql
2301_793086872 小时前
Mysql group by
数据库·mysql
草莓熊Lotso2 小时前
【数据结构初阶】--排序(一):直接插入排序,希尔排序
c语言·数据结构·经验分享·其他·排序算法
小徐不徐说3 小时前
C++ 模板与 STL 基础入门:从泛型编程到实战工具集
开发语言·数据结构·c++·qt·面试
_码农121383 小时前
spring boot + mybatis + mysql 只有一个实体类的demo
spring boot·mysql·mybatis
Tisfy4 小时前
LeetCode 2411.按位或最大的最小子数组长度:一次倒序遍历
数据结构·算法·leetcode·题解·位运算·遍历
晚云与城5 小时前
【数据结构】-----排序的艺术画卷
数据结构·算法·排序算法
j_xxx404_6 小时前
数据结构:算法复杂度与空间复杂度
c语言·数据结构·算法