MySQL中truncate table 和 delete命令

相同点:都可以删除数据表中的数据

区别:1、truncate table 速度要更快一些,但truncate删除后不记录mysql 日志,不可以恢复数据。

          2、如果没有外键关联,innodb执行truncate是先drop table(原始表),再创建一个跟原始表一样的空表,速度要远远快于delete逐条删除行记录。

          3、如果使用innodb_file_per_table参数,truncate table 能够重新利用释放的硬盘空间,在Innodb plugin中,truncate table 为自动回收,如果不适用innodb plugin,那么需要使用optimize table 来优化表,释放空间。truncate table 删除表后,optimize table 尤其重要,特别是大数据库,表空间可以得到释放。

          4、表有外键关联,truncate table删除表数据为逐行删除,如果外键指定级联删除,关联的子表也会被删除所有表数据。如果外键未指定级联,truncate table 逐行删除数据,如果是父行关联子表行数据,将会报错。

          5、auto_increment计数器在truncate table后会重置为0。与是否有外键无关。

eg  truncate table table_name;     delete from table_name;

 

注:一个大的DELETE或INSERT操作,要非常小心,因为这两个操作是会锁表的,表一锁住,其他操作就进不来了。删除数据的速度和创建索引数量是成正比的。所以在超大型数据库中,删除时处理好索引关系非常重要,推荐的折中方法:在删除数据之前删除那几个索引,然后删除其中无用数据,删除完成后重新创建索引。

 

MySQL中optimize table命令

在使用mysql的时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小。这时因为mysql在删除数据(特别是text和blob)的时候,会留下许多的数据空洞,这些空洞会占据原来数据的空间,所以文件的大小没有改变。这些空洞在以后插入数据的时候可能会被再度利用起来,当然也有可能一直存在。这种空洞不仅额外增加了存储代价,同时也因为数据碎片化降低了表的扫描效率。使用optimize table 来重新利用未使用的空间,并整理数据文件的碎片。【当您的库中删除了大量的数据后,可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。】

optimize table 只对 MyISAM,BDB和 InnoDB表起作用。

对于BDB表,optimize table 目前被映射到ANALYZE TABLE 上。对于Innodb表,optimize table 被映射到alter table 上,这会重建表,重建操作能更新索引统计数据并释放聚簇索引中的未使用空间。

注:在optimize table运行过程中,mysql会锁表。

对于myisam可以直接使用 optimize table table.name,当是innodb引擎时,会报“table does not support optimize,doing recreate + analyze instead”,一般情况下,由myisam转换成innodb,会用到alter table table.name engine='innodb'进行转换,优化也可以用这个。所以当是innodb引擎时我们就用alter table table.name  engine='innodb' 来代替optimize做优化就可以。

查看前后效果可以使用 show table status命令,例如:show table status from [database] like '[table_name]';返回结果中的data_free即为空洞所占据的存储空间。