mysql索引结构

mysql索引结构

一页16K,节点分成2种,也子目录节点和数据数据。
节点和节点之间有前后指针,记录只存放下一条记录的指针
目录节点里面存放页类型(是目录节点还是也节点),最大值和最小值,目录节点的记录存放子页的指针和子页的最小值

数据页节点存放,最大值和最小值,数据记录存放记录类型和下一条记录的指针。

目录节点记录里面存的数据很少,主要是指针和最小值,所以一页数据可以存很多数据,大约1000条。

数据节点记录里面有只整条记录,所以存放的记录数很少根据一行记录的大小确定能存多少,大约在100条级别。

mysql索引一般不会超过4层(每多一层就多次磁盘IO),更节点一层,数据节点一层,如果有2层目录节点,那么大约可以存放1000*1000x1000x100=1000亿条数据。实际如果目录节点存的最值是字符类型或者是复合索引,就没有1000条,数据类型如果一条记录很大也没有100条。而且索引每个节点下面的数据不是均匀的,这导致mysql即便是4层结构B+数的时候一般存不到1000亿条数据。

所以决定mysql能存多少数据的主要因素是索引字段长度和记录的长度。

2层b+数结构图

image-20250827205253972

3层B+数结构图

image-20250827211531328

上面的图是聚簇索引(主键索引),二级索引数据节点里面存的不是完成的记录,而是指向聚簇索引数据节点的引用(一般是主键ID)。所以二级索引会多一次磁盘IO。

如果是B-tree结构那么目录节点出了放下节点的地址还要放数据,这样会导致目录节点存入的记录数量变少,所以不适合用于存储大量的数据,这也是Mysql使用B+tree的原因。并且B+tree的所有数据都放在叶子节点,每条记录都是通过单项链表连接,所以对范围查询有利。

posted on 2025-09-02 17:43  zhangyukun  阅读(13)  评论(0)    收藏  举报

导航