前言

truncate 是一个我们也经常会使用到的命令 

其作用类似于 delete from $table;

但是 他会比 delete 块很多,这里我们来看一下 它的实现

delete 的时候会逐行进行处理, 打上 删除标记, 然后 由后台任务 进行数据处理

 

 

truncate table 的实现

执行 sql 如下 “truncate table tz_test_big_table_copy;”

这里的主要的流程是 一系列的校验, 生成新的newTableId, 删除索引, 重新创建索引, 关联 newTableId 和已有的元数据信息, truncate idb 文件 等等 

我们这里 主要是 查看一下 这些关键的流程

 

新建一个 table_id, 以及其关联到 index, space 等等 

45 mysql truncate 的实现_数据处理

 

清理 待删除 数据表的相关索引

45 mysql truncate 的实现_SYS_02

 

重置 fspHeader 的相关内容 

45 mysql truncate 的实现_数据处理_03

 

重新创建 tz_test_02 的相关索引 

45 mysql truncate 的实现_SYS_04

 

更新 information_schema 中的相关元数据信息 

45 mysql truncate 的实现_元数据_05

 

truncate 数据表 tz_test_big_table_copy 的 idb 文件, 仅仅保留 114688 字节

45 mysql truncate 的实现_truncate_06

 

information_schema 中相关元数据信息如下

select * from INNODB_SYS_TABLES where TABLE_ID = 32;
select * from INNODB_SYS_INDEXES where TABLE_ID = 32;
select * from INNODB_SYS_COLUMNS where TABLE_ID = 32;
select * from INNODB_SYS_VIRTUAL where TABLE_ID = 32;
  • 1.
  • 2.
  • 3.
  • 4.

 

45 mysql truncate 的实现_truncate_07

45 mysql truncate 的实现_truncate_08

45 mysql truncate 的实现_元数据_09

 

45 mysql truncate 的实现_元数据_10