前言页分裂Page Split是 InnoDB 存储引擎中一个极其重要却常被忽视的底层机制。它直接影响着数据库的写入性能、空间利用率和查询效率是每一位研发人员和 DBA 都应该深入理解的核心知识。本系列文章将分为上、中、下三篇由浅入深地带你全面掌握页分裂话不多说我们从上篇开始。一、什么是页分裂先聊聊页InnoDB 中页Page是数据存储和读写的最小单位默认大小为16KB。而 MySQL 的表是索引组织表每个页中的记录按照主键的物理顺序排列并非插入顺序形成一个单向链表。页与页之间则通过双向链表相互连接共同构成一棵B 树索引结构。再说页分裂当我们向一个已经塞满了的页中插入新数据时这个页已经没有足够的空间来容纳新记录了。此时InnoDB 会执行一个操作 ——页分裂Page Split。页分裂就是将一个已满的数据页拆分成两个页并将部分数据迁移到新页中以腾出空间存放新插入的记录。这个过程对应用层完全透明但在底层却涉及数据搬迁、指针调整、B 树结构变更等一系列操作。二、页分裂的过程页分裂的触发和执行可以分为以下几个步骤① 插入请求当一条insert语句执行时InnoDB 根据主键值定位到数据应该插入的目标页。② 判断空间是否充足InnoDB 检查目标页的剩余空间。如果空间足够直接插入流程结束。如果空间不足则触发页分裂。③ 申请新页、数据迁移InnoDB 从表空间中申请一个新的空白页。这是页分裂的核心步骤。InnoDB 会将原页中大约一半的记录移动到新页中。具体来说原页保留前半部分的记录新页承接后半部分的记录新插入的数据根据主键大小放入对应的页中这里的一半并不是严格的 50%InnoDB 会根据实际情况做一定的优化调整。④ 调整指针与索引数据搬迁完成后还需要做以下工作更新页之间的双向链表指针将新页正确地链接到原页和原页的下一页之间更新父节点上层索引页在 B 树的上层节点中插入一条指向新页的索引记录如果上层节点也满了则会递归触发上层页的分裂极端情况下甚至可能导致 B 树层级增加三、页分裂的弊端页分裂虽然是 InnoDB 维护 B 树结构的必要机制但它带来的负面影响不容忽视。1 性能开销大页分裂涉及数据复制、页申请、指针修改、索引更新等多个步骤这些操作都需要额外的 CPU 和 I/O 资源。在高并发写入场景下频繁的页分裂会显著拖慢写入性能。2 空间利用率下降分裂后原页和新页通常都只有一半左右的数据这意味着页的空间利用率从接近 100% 骤降到约50%。大量的页分裂会导致表的物理存储膨胀占用更多的磁盘空间同时也会降低缓冲池的命中率。3 产生磁盘碎片页分裂后新申请的页在磁盘上的物理位置不一定与原页相邻。这会导致原本连续的数据变得离散分布使得范围查询和全表扫描时需要更多的随机 I/O而非高效的顺序 I/O。4 影响并发性能页分裂过程中InnoDB 需要对相关的页加锁。这意味着在分裂期间其他事务对这些页的读写操作可能被阻塞从而影响并发吞吐量。