MySQL中delete与truncate的区别

时间:2022-09-16 11:46:45

MySQL删除数据有些情况下会直接释放物理磁盘空间,但有些情况不会。

1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM 。

2.truncate table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM 。truncate table其实有点类似于drop table 然后creat,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近drop table的速度。

3.delete from table_name删除表的全部数据,对于MyISAM 会立刻释放磁盘空间 (应该是做了特别处理,也比较合理),InnoDB 不会释放磁盘空间。

4.对于delete from table_name where xxx带条件的删除, 不管是innodb还是MyISAM都不会释放磁盘空间。

5.delete操作以后使用optimize table table_name 会立刻释放磁盘空间,不管是innodb还是myisam 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table 操作。

6.delete from表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。

注意:执行optimize table table_name时可能会报错:creating index gen_clust_index required more than innodb_online_alter_log_max_size。

此时就要将innodb_online_alter_log_max_size参数值调大;
show variables like '%cache%';//查看该参数的大小
set global innodb_online_alter_log_max_size = 9663676416;//这是我遇到此错误时,重新设置的参数大小。
再次执行optimize table table_name就正常了,物理磁盘空间也释放了。