内容简介:空洞:
空洞: 可以被复用但没有被使用的空间 ,经过大量 增删改 的表,都会存在空洞
删除
- 如果删掉
R4,InnoDB只会将R4标记为删除 ,如果再插入 300~600 的记录时,可能会 复用 这个位置,但磁盘文件不会缩小- 记录的复用 ,仅限于 符合范围 条件的数据
- 如果删除了 一个数据页上的所有记录 ,那么 整个数据页 都可以被 复用 的
- 当 整个页 从B+树里摘除后,可以被复用到 任何位置
- 如果将
page A上的所有记录删除后,page A会被 标记为可复用- 当插入ID=50的记录时,需要 申请新页 时
page A可以被复用
- 当插入ID=50的记录时,需要 申请新页 时
- 如果 相邻 的两个数据页 利用率 都很小
- 系统会把这两个数据页上的数据 合并 到其中一个页上,另一个数据页就会被标记为 可复用
- 如果通过
DELETE命令 删除整个表 ,那么 所有的数据页 都会被 标记为可复用 ,但磁盘上的文件同样不会变小 -
TRUNCATE=DROP+CREATE
插入
- 如果数据是 随机插入 的,就有可能造成 索引的数据页分裂
-
page A已满,如果再插入ID=550的数据,就必须申请一个新的页面page B来保存数据,导致 页分裂 ,留下了空洞
更新
更新 索引 上的值,等同于 先逻辑删除旧值后再插入新值 ,同样也会造成 空洞
重建表
逻辑过程
- 新建一个与表A 结构相同 的表B
- 按照 主键递增 的顺序,把表A中的数据一行一行读出,然后再插入表B
- 表B的主键索引更 紧凑 ,数据页的 利用率 也更高
- 表B作为 临时表 ,数据从表A导入到表B,然后用表B替换A
重建命令
ALTER TABLE A ENGINE=InnoDB;
ALTER TABLE 默认会 提交前面的事务
Before MySQL 5.5
- 与上述的逻辑过程类似,MySQL 自动完成 转存数据,交换表名和删除旧表等操作
- 时间消耗最多的是往 临时表 ( Server层 )插入数据的过程,在这个过程中,如果 新数据 要写入表A,就会造成 数据丢失
- 因此整个DDL过程中,表A是不能执行DML的,即不是 Online 的
- MySQL 5.6引入 Online DDL
Since MySQL 5.6
- 建立一个 临时文件 ( InnoDB内部 ),扫描表A主键的所有数据页
- 用数据页中表A的记录生成B+树,存储到临时文件
- state 2( 日志 ):生成临时文件的过程中,将所有对A的 操作 记录在一个 日志文件 ( row log )中
- state 3( 重放 ):临时文件生成后,将日志文件的操作 应用到临时文件 ,得到一个 逻辑数据 上与表A相同的数据文件
- 用最新的临时文件替换表A的数据文件
MDL锁
-
ALTER语句在 启动 时需要获取 MDL写锁 ,但会在 真正拷贝数据之前退化为MDL读锁- MDL读锁 不会阻塞 其他线程对这个表的 DML ,同时又能 阻塞 其他线程对这个表的 DDL
- 对一个大表来说,
Online DDL最耗时的过程是 拷贝数据到临时表 的过程,期间是可以接受DML- 相对于整个DDL过程来说, 锁的时间非常短 ,对 业务 来说,可以认为是
Online
- 相对于整个DDL过程来说, 锁的时间非常短 ,对 业务 来说,可以认为是
性能消耗
- 重建表会 扫描原表数据 和 构建临时文件(或临时表)
- 对于大表来说,重建表会 非常消耗IO和CPU资源
- 推荐工具:
gh-ost
Online + Inplace
-
tmp_table是一个 临时表 ,在 Server 层创建的 -
tmp_file是 临时文件 ,在 InnoDB 内部创建的, 整个DDL过程都在InnoDB内部完成- 对于 Server 层来说,并没有把数据挪动到 临时表 ,是个原地操作( Inplace )
- DDL过程如果是Online的,那一定是Inplace的,反之不成立
-
ALTER TABLE t ADD FULLTEXT(field_name);是 Inplace 的,但会阻塞DML( 非Online )
-
ALTER TABLE A ENGINE=InnoDB; 等同于 mysql> ALTER TABLE t ENGINE=InnoDB, ALGORITHM=INPLACE; Query OK, 0 rows affected (0.68 sec) Records: 0 Duplicates: 0 Warnings: 0
与 Inplace 对应的是 Copy ,强制拷贝表到 Server 层
mysql> ALTER TABLE t ENGINE=InnoDB, ALGORITHM=COPY; Query OK, 100000 rows affected (1.46 sec) Records: 100000 Duplicates: 0 Warnings: 0
ALTER + ANALYZE + OPTIMIZE
-
ALTER TABLE t ENGINE=InnoDB: 重建表 -
ANALYZE TABLE t:触发 表索引信息的重新采样统计 -
OPTIMIZE TABLE t:ALTER+ANALYZE
参考资料
《MySQL实战45讲》
转载请注明出处:http://zhongmingmao.me/2019/02/01/mysql-reclaim-space/
访问原文「MySQL -- 空间回收」获取最佳阅读体验并参与讨论
以上所述就是小编给大家介绍的《MySQL -- 空间回收》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 比特币白皮书:回收硬盘空间
- MySQL表的碎片整理和空间回收小结
- 垃圾回收算法(7)-分代回收算法
- JAVA 垃圾回收机制(二) --- GC回收具体实现
- 对象回收判定与垃圾回收算法-JVM学习笔记(1)
- 必知必会JVM垃圾回收——对象搜索算法与回收算法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
可计算性和计算复杂性
朱一清 / 国防工业出版社 / 2006-4 / 18.0
本书深入浅出地介绍了研究可计算性的四个主要模型以及四个模型彼此之间的关系:介绍了计算复杂性的基本概念和重要的研究方法与一些研究成果。内容涉及递归函数、图灵机、λ演算、马尔可夫算法、计算复杂度的分类、NP完全理论、非一致复杂性等。分述于十章,书中附有习题。 本书可作为广大有志于突破计算复杂性研究僵局——“P=NP?”的科技工作者,计算机科学和元计算机科学工作者,数学和元数学工作者以及大......一起来看看 《可计算性和计算复杂性》 这本书的介绍吧!