所有碎片表的Mysql OPTIMIZE TABLE

时间:2009-06-23 11:01:55

标签: mysql optimization fragmentation defragmentation

我想OPTIMIZE所有当前碎片化的表格。这些表格应为information_schema.DATA_FREE > 0

是否可以在SQL中的一个命令中使用此属性优化所有表,或者我是否必须编写外部代码才能执行此操作?

3 个答案:

答案 0 :(得分:37)

您可以这样做:

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;

答案 1 :(得分:1)

好吧,这是一篇旧帖子,但这是必要的。

Phil Dufault 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

就是这样。 一段时间以来一直在许多服务器上使用它。

答案 2 :(得分:0)

我知道有答案。但MySQL对INNODB DB提出了这个建议:

  

如果您定期执行“空”更改,它可以加快索引扫描速度   TABLE操作,导致MySQL重建表:

     

ALTER TABLE tbl_name ENGINE=INNODB

在这里找到 http://dev.mysql.com/doc/refman/5.0/en/innodb-file-defragmenting.html