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

相关推荐
2301_322414280411 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
库库的数据库笔记14 小时前
国产信创数据库的MySQL兼容性深度对比解析
大数据·数据库·mysql·oceanbase·政务
careathers15 小时前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
y1su16 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
吹什么轩17 小时前
MySQL:数据库基础
数据库·mysql
FluxDB18 小时前
用 Rust + GPUI 重做数据库客户端
数据库·mysql
Yyyyyy~18 小时前
【Mysql】增删查改操作
数据库·mysql
BBmmo18 小时前
MySQL 里大小写不同的邮箱,为什么会撞上唯一索引?
mysql
专注仿真19 小时前
从「能跑通」到「能交付」:一套可直接落地的电商用户行为分析平台(Python + SQLite/MySQL + Streamlit 全栈源码与部署文档)
python·mysql·sqlite
1024奇点20 小时前
【仓颉语言入门 · 第二篇 第 10 课】
开发语言·数据库·ide·mysql·开源