什么是数据页空洞?
innodb存储引擎是以b+树的形式组织数据的,b+树的叶子节点上存储的是数据页,数据页上存储的是数据记录,每个数据页的大小固定为16KB。如下图,当删除ID = 500这条记录时,实际上,引擎只会将这条记录标记为删除,由于数据页的大小是固定的,所以磁盘空间并不会缩小,但是标记为删除的记录空间是可以被复用的,这些可以被复用,但是没有被使用的空间,就形成了 "空洞"。
标记为删除,空间可复用,需要满足条件:300 < ID < 600delete(500)
哪些操作可以形成数据页空洞?
1)数据删除
见上图
2)数据插入
如果数据按照索引递增顺序插入,索引是紧凑的,如果是随机插入,则会造成索引的数据页分裂,而引起空洞
3)更新索引上的值
更新索引上的值,原理是删除旧的值,再插入新的值,因此也会造成空洞
怎样减少数据页空洞?
严格来讲,数据页空洞无法完全避免,但是我们可以尽量提高数据页的利用率:
采用递增ID,尽量保证索引紧凑。
对于需要频繁更新的字段,不适宜索引,不仅会造成数据页空洞,也会增加数据库负载,因为索引树要不断被重构。
对于删除数据的业务,定期检查磁盘碎片率,人工介入整理磁盘碎片。
如果空洞已经存在,如何消除?
重建表:alter table ...
重建表流程: