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`;
我的 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`;