MyISAM 文件大小增加(加倍)

MyISAM files size has increased (doubled)

我的 table 的一个文件(.MYD 文件)增加了大约 100%。 如果我查看数据,就会发现过去几天的每日负载正常。什么可能导致此文件大小增加?

myisamchk

根据用户的建议,我尝试了 sudo myisamchk -r tablename。此操作的结果是 "Fixing index 1" "Fixing index 2" ... 和完全相同的文件大小。

编辑: 第二次执行 运行 命令后,文件大小减小到正常(一半)大小。

@e4c5 的答案最有可能。他要求您删除已删除的行。 MySQL 不会从删除的行中回收 space。随着越来越多的行被删除,您的 .MYD 变得越大。回收 space 的唯一方法是重建 .MYD - 通过重新创建 table,使用优化 table 命令或 运行ning myisamchk -r.

以下命令将重建 table。

optimize table $table_name;

myisamchk -r 命令行方法也有效 - 但请确保 table 已锁定以防止用户访问它(否则您 运行 将面临丢失数据的真正风险)。确保在 运行ning myisamchk 修复后再次使用它之前刷新 table 否则 MySQL 将检测到 table 已更改并且 运行 对其进行不必要的检查。在这三种方法中,myisamchk -r 是最容易丢失数据的(但仍然是我的首选方法——你只需要小心并做好最坏的打算)。

听起来你每天都在更换整个 table。这是一种最佳方法;没有膨胀,没有 OPTIMIZE:

CREATE TABLE new LIKE real;
populate `new`
RENAME TABLE real TO old,
             new TO real;
DROP TABLE old;

这样,您就构建了一个干净的新 table 并将其换入。请注意 table 始终可用;也就是说,没有停机时间。

根据@rick-james的回答,我进一步查看并找到了another thread。这就是诀窍......非常快并且没有停机时间(如果 table 没有在 运行 期间写入)。

-- table_org is the name of the table to 'optimize'

CREATE TABLE `table_new` LIKE `table_org`;
-- disable keys for quick inserts
ALTER TABLE `table_new` DISABLE KEYS;

INSERT INTO `table_new`
SELECT * FROM `table_org`;

ALTER TABLE `table_new` ENABLE KEYS;

RENAME TABLE `table_org` TO `table_old`, `table_new` TO `table_org`;

DROP TABLE `table_old`;

-- is not needed, but just to have an up-to-date data
ANALYZE TABLE `table_org`;