为什么骗子桌的尺寸只有一半?

时间:2016-05-10 12:54:28

标签: mysql duplicates

我复制了一张像这样的大表:

CREATE TABLE newtable LIKE oldtable; 
INSERT newtable SELECT * FROM oldtable;

我之后检查过这样的行:

select count(*) from oldtable;
select count(*) from newtable;

确保他们拥有相同的行数

然而在Navicat(我不信任的数量)数据长度似乎有点偏离所以我对这样的大小进行了查询:

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "$MY_DB"
    AND table_name = "#MY_TABLE"

欺骗桌确实几乎是1/2的大小。我现在知道这是一些稀疏的信息,但我现在想知道是否:

  1. 复制时出现一些错误(现场检查表明没有)
  2. 以某种方式复制(d)数据/索引

1 个答案:

答案 0 :(得分:0)

在InnoDB表上,随着时间的推移,索引将积累类似于硬盘碎片的内容,其中INSERTDELETE操作会在索引文件中留下空间,而这些空间不可供操作重用系统

通过INSERT INTO...SELECT *...复制表,新表基本上得到了一个更清晰的索引,而旧索引的碎片更少。您可以通过running an OPTIMIZE TABLE statement在旧桌面上回收该空间。

  

在这些情况下使用OPTIMIZE TABLE,具体取决于表的类型:

     

在具有自己的.ibd文件的InnoDB表上进行实质性插入,更新或删除操作后,因为它是在启用了innodb_file_per_table选项的情况下创建的。重新组织表和索引,并且可以回收磁盘空间以供操作系统使用。

所以在您的环境中:

OPTIMIZE TABLE oldtable

之后,再次检查index_length中的information_schema.TABLES,其大小可能会更接近重复的表格。

注意:在大型表上这可能需要很长时间,因此在锁定时会出现问题,因此不应尝试。对于InnoDB,MySQL实际上可能会丢弃并重新创建表,而不是优化现有的索引。

经过一些测试后的附录:

即使在我的测试中复制一个大表,虽然新表index_length比旧表OPTIMIZE TABLE小得多,但它仍然有可以用*array = 10; 回收的空间。优化新复制的表后(没有插入/删除插入/删除),旧的和新的都有相同的大小。