【发布时间】:2010-11-05 03:17:01
【问题描述】:
我想OPTIMIZE所有当前碎片化的表。这些表应该有information_schema.DATA_FREE > 0。
是否可以在 SQL 的一个命令中优化具有此属性的所有表,还是我必须编写外部代码才能做到这一点?
【问题讨论】:
标签: mysql optimization fragmentation defragmentation
我想OPTIMIZE所有当前碎片化的表。这些表应该有information_schema.DATA_FREE > 0。
是否可以在 SQL 的一个命令中优化具有此属性的所有表,还是我必须编写外部代码才能做到这一点?
【问题讨论】:
标签: mysql optimization fragmentation defragmentation
我知道有答案。但是 MySQL 对 INNODB DB 有以下建议:
如果您定期执行“空”ALTER,它可以加快索引扫描 TABLE 操作,导致 MySQL 重建表:
ALTER TABLE tbl_name ENGINE=INNODB
在这里找到 http://dev.mysql.com/doc/refman/5.0/en/innodb-file-defragmenting.html
【讨论】:
好的,这是一个旧帖子,但这是必需的。
菲尔·杜福http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/ 写了一个很棒的脚本,在 github 上: https://github.com/pdufault/mysqlfragfinder/blob/master/mysqlfragfinder.sh
vim mysqlfragfinder.sh
#copy paste from github
chmod +x ./mysqlfragfinder.sh
./mysqlfragfinder.sh --user root_username --password root_password
仅此而已。 已经在多台服务器上使用它一段时间了。
【讨论】:
你可以这样做:
SELECT concat("OPTIMIZE TABLE ", table_schema,".",table_name,";")
FROM tables
WHERE DATA_FREE > 0
INTO OUTFILE '/tmp/optimize.sql';
SOURCE '/tmp/optimize.sql';
或者,如果第一个失败,请尝试:
SELECT concat("OPTIMIZE TABLE ", table_schema,".",table_name,";")
FROM information_schema.tables
WHERE DATA_FREE > 0
INTO OUTFILE '/tmp/optimize.sql';
SOURCE /tmp/optimize.sql;
【讨论】: