大白话介绍页合并
想象你的书架上有很多书,每本书代表一页数据。随着你不断取书和还书,某些书架上的书可能只填充了一半。如果相邻的两个书架都只填了一半,你可能会考虑把它们合并到一个书架上,这样既节省了空间,也让书架看起来更整齐。
-
发现空间浪费:就像注意到两个半满书架可以合并一样,InnoDB会发现有些页的数据太少了。
-
找到邻居:检查这个半空页旁边的页,看看它们是否也可以合并。
-
检查是否适合合并:就像判断两个书架的书是否都能放进一个书架一样,InnoDB会判断合并后的数据是否仍然适合放在一页中。
-
合并它们:将两个页的数据合并到一个页中,另一个页就变成了空页,可以用来存储其他数据。
-
更新目录:就像你可能需要更新书架的标签一样,InnoDB需要更新数据的索引,确保它们指向正确的位置。
-
准备下一次使用:空出的页被标记为可用,等待未来存放新数据。
具体流程介绍
-
触发条件:当InnoDB中的数据被删除,导致某些页的数据密度低于设定阈值(例如,页内数据量低于页容量的50%)时,页合并操作可能会被触发。
-
查找邻近页:InnoDB存储引擎会检查当前页的前一个或后一个页,判断这些页是否也是半满的,如果是,则它们是合并的候选对象。
-
评估合并可行性:系统会评估将这些页合并后的总数据量是否能够适合存放在单个页中。如果可以,就继续合并操作;如果合并后的数据量超过了一页的容量,那么合并操作不会发生。
-
执行合并:一旦决定合并,InnoDB会将两个页中的数据合并到一起,填充到其中一个页中,另外一个页则会被标记为可重用,之后可能会被分配给其他数据。
-
更新索引:合并页之后,任何指向被合并页的索引都需要更新,以反映数据现在所在的新位置。
-
清理和重用:合并操作完成后,被清空的页会被加入到空闲列表中,等待未来被重新分配。
案例演示
-
目前表中已有数据的索引结构(叶子节点)如下
当我们对已有数据进行删除时,具体的效果如下: 当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间 变得允许被其他记录声明使用。
当我们继续删除2#的数据记录
当页中删除的记录达到 MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前 或后)看看是否可以将两个页合并以优化空间使用。
删除数据,并将页合并之后,再次插入新的数据21,则直接插入3#页
这个里面所发生的合并页的这个现象,就称之为 "页合并"。
-
【merge_threshold】
-
合并页的阈值,可以自己设置,在创建表或者创建索引时指定
-
案例来源:黑马MySQL课程