如何正确的删除数据和空间

如何正确的删除数据和空间

  • 数据删除了,但是表占的空间却没变?
    • 有一个参数是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的操作