新增数据时,MySQL索引树的自调整过程
刚开始你一个表建好后,就一个数据页,就是聚簇索引的一部分,而且还是空的。若你插入数据,就是直接往这数据页里插入,也没必要给他弄索引页:
初始数据页就是个根页,每个数据页内部默认就有一个基于主键的页目录,所以根据主键查找都没问题,直接在这唯一一个数据页里根据页目录找。
但随着表里数据越来越多,你的数据页满了,就要搞个新数据页,将你根页面里的数据都拷贝过去,同时再搞一个新的数据页,根据你的主键值的大小进行挪动,让两个新的数据页根据主键值排序,第二个数据页的主键值都大于第一个数据页的主键值:
此时根页就升级为索引页了,这根页里存放:
-
两个数据页的页号
-
他们里面最小的主键值
所以此时看起来根页就成为了索引页,引用了两个数据页。
随着你不停插数据,然后数据页不停地页分裂,分裂出来更多的数据页。你唯一这个索引页,即根页里存放的数据页索引条目越来越多,连你的索引页都放不下了,那就让一个索引页分裂成两个索引页,然后根页继续往上走一个层级,引用两个索引页。
数据页越来越多,那根页指向的索引页也不停分裂,分裂出更多索引页,当你下层索引页数量太多时,会导致你的根页指向的索引页太多,根页继续分裂成多个索引页,根页再次上移一个层级。这就是你增删改时,整个聚簇索引维护的一个过程。
二级索引
同理,比如你name字段有一个索引,那么刚开始的时候你插入数据,一方面在聚簇索引的唯一的数据页里插入,一方面在name字段的索引B+树唯一的数据页里插入。
随着后续数据越来越多,name索引树里唯一的数据页也会分裂,整个分裂的过程跟上面一样,所以你插入数据的时候,本身就会自动维护你的各索引树。
你的name字段的索引B+树里的索引页中,其实除了存放页号和最小name字段值以外,每个索引页里还会存放那个最小name字段值对应的主键值。因为有时会出现多个索引页指向的下层页号的最小name字段值一样,就得根据主键判断。
比如插入一个新的name值,他需要根据name索引树的根页开始,逐层查找自己这个新的name值应该插入到叶节点的哪个数据页。
万一遇到同层里不同索引页指向不同的下层页号,但name值一样,就得根据主键值比较:新的name值插入到主键值较大的那个数据页里!
相关文章
- 【MySQL】Explain详解与索引优化实战
- MySQL定时器开启、调用实现代码
- mysql数据索引,加快查询速度
- 10 分钟搞明白 MySQL 是如何利用索引的!
- MySQL基本配置
- MySQL Replication 主从同步
- 图解MySQL索引--B-Tree(B+Tree)
- mysql学习笔记-- 多表查询之外键、表连接、子查询、索引
- MySQL高级-索引优化
- MySQL 索引分析
- MySQL 使用mysqld_multi部署单机多实例详细过程
- 在CentOS里使用MySQL Connector/C++
- MySQL force Index 强制索引概述
- [mysql]多个字段确定唯一性-联合唯一索引
- 2022-11-17 mysql列存储引擎-聚合中间缓存结果-分析
- 2023-03-09 MySQL源码分析-MySQL中的直方图
- 【云原生】阿里云ACK部署MySQL & 数据持久化存储
- mysql隔离级别
- mysql,命令导入导出表结构或数据
- MySQL 索引优化 Using where, Using filesort
- MySQL 处理重复数据
- mysql 数据库的操作
- mysql联合索引是否生效的实际测试
- PostgreSQL 10 + PostGIS + Sharding(pg_pathman) + MySQL(fdw外部表) on ECS 部署指南(适合新用户)
- [ 数据库 ] MySQL 入门到放弃(七) --- 索引
- mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例(GAP锁的问题)
- Mysql时间范围查询不走索引问题
- MySQL 索引的使用
- mysql索引 多个单列索引和联合索引的区别
- mysql 添加索引语句
- 【mysql我能讲两小时001】mysql使用的索引数据结构是什么?