如何正确的删除数据和空间
分类:
文章
•
2022-12-31 23:49:29
如何正确的删除数据和空间
- 数据删除了,但是表占的空间却没变?
- 有一个参数是innodb_file_per_table,在版本5.6之后就默认为on,off的时候表数据在共享表空间,即使表删除了,空间也不会回收,
- on的话,是独立占据一个文件
- 需要在删除之后,再alter table重建表才能让空间变小
造成的其他原因
- 索引空洞:
- 在索引删除了之后,这个索引留下的空间是能被复用的,没有被回收,如果没能被复用,就造成了索引空洞,空间浪费,
- 索引新增的时候也会造成索引空洞
- 解决:重建表
- 在5.6之后的OnlineDDL,重建表的流程
- 建立临时文件,扫描表a主键的所有数据页
- 用数据页中表 A 的记录生成 B+ 树,存储到临时文件中;
- 生成临时文件的过程中,将所有对 A 的操作记录在一个日志文件(row log)中,对应的是图中 state2 的状态;
- 临时文件生成后,将日志文件中的操作应用到临时文件,得到一个逻辑数据上与表 A 相同的数据文件,对应的就是图中 state3 的状态;用临时文件替换表 A 的数据文件。
online和inplace的区别
- DDL过程如果是Online就一定是inplace
- inplace的DDL,有可能不是Onlline的
- optimize table,analyze table,alter table重建表的区别
- alter table t engine = Innodb就是
analyze table t不是重建表,只对索引信息做重新统计,没有修改数据,这个过程加了MDL读锁
- optimize table t 等于recreate + analyze
- alter table 语句会默认提交前面的事务,也就是说,在执行数据修改的同时(还没提交),增加列名,会自动提交掉update的操作