群友聊天,有人求助一个问题,他要清理一张数据量超大的表,大概1.5G(其实也不算大),执行了TRUNCATE命令后10分钟过去都没反应。

以下,给个方案,特地自己造了张表出来

表名`tao_order_sub_info`,我从测试环境扒到本地来的,淘宝订单子表,共计356万行数据,79个字段,表文件大小2.41G

接下来开始正式操作,新建一张表`tao_order_sub_info_bak`,表结构都同原来的表

如果有部分需要保留的数据,可以在这里将需要保留的数据灌入新建的表

insert into tao_order_sub_info_bak (select * from tao_order_sub_info where N_ID < 100)

接下来同时修改新表旧表的表名,用一句SQL执行

rename table tao_order_sub_info to tao_order_sub_info_old,tao_order_sub_info_bak to tao_order_sub_info

将原表改名为一个另外一个名字,同时将刚刚新建的表改名为原来的表名,因为是在一个sql语句中执行的,可以保证本次操作的对两张表的操作是原子的。

接下来,对新的`tao_order_sub_info`表的查询写入就是这张新生成的没有数据的表了。我们可以直接删除旧表(drop table),或者进行相关备份存档操作

实测这2.4G的表执行truncate其实也是很快的,这位网友执行truncate非常慢的原因应该不是数据问题