为什么mysqldump恢复到较小的大小?

use*_*473 4 mysql mysqldump

我在 Windows 10 上使用 MySQL 和 mysqldump v8.0.19。我有一个 InnoDB 数据库,old. 我使用 mysqldump (和--no-create-db选项)来转储其表。然后,我创建一个新数据库,new并使用以下命令导入转储的表

mysql -u myName -p new < old.sql
Run Code Online (Sandbox Code Playgroud)

这个过程似乎是有效的,因为old和中的表new似乎具有完全相同的数据和完全相同的键。CHECK TABLE显示 中的表没有问题new,并且像这样的命令SELECT * FROM old.table1 UNION SELECT * FROM new.table1显示新旧表之间没有差异。

但尽管如此,新桌子还是更小。具体来说,此命令显示它们在data_length和中都较小index_length

SELECT concat( table_schema, '.', table_name ) table_name,
  concat( round( data_length / ( 1024 *1024 ) , 2 ) , 'M' ) data_length,
  concat( round( index_length / ( 1024 *1024 ) , 2 ) , 'M' ) index_length, 
  concat( round( round( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) total_size
  FROM information_schema.TABLES
  ORDER BY ( data_length + index_length ) DESC;
Run Code Online (Sandbox Code Playgroud)

为什么恢复的表较小(我应该担心)?

六年前,有人在 Stack Overflow 上提出了一个 [/sf/ask/1729543931/](像这样的问题),但从未得到任何答复。

Nik*_*kiy 5

InnoDB 将记录存储在页内(默认情况下每个页大小等于 16 KB)。由于不同的原因,您可能会部分填充页面(例如,在删除一些记录后)。当您使用 mysqldump 恢复数据库时,您将从头开始重建表并收到数据库碎片较少的版本。您可以使用 OPTIMIZE TABLE 命令对旧数据库中的表进行碎片整理并释放一些空间。