我复制了一张像这样的大表:
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的大小。我现在知道这是一些稀疏的信息,但我现在想知道是否:
答案 0 :(得分:0)
在InnoDB表上,随着时间的推移,索引将积累类似于硬盘碎片的内容,其中INSERT
和DELETE
操作会在索引文件中留下空间,而这些空间不可供操作重用系统
通过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;
回收的空间。优化新复制的表后(没有插入/删除插入/删除),旧的和新的都有相同的大小。