2009-06-23 68 views
16

我想要OPTIMIZE所有当前碎片表。这些表应该有information_schema.DATA_FREE > 0所有碎片表的Mysql优化表

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

回答

36

你可以做这样的事情:

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; 
+9

为我工作所需的微小变化,但伟大的方法。 (“OPTIMIZE TABLE”,table_schema,“。”,table_name,“;”)FROM information_schema.tables WHERE DATA_FREE> 0 INTO OUTFILE'/tmp/optimize.sql'; SOURCE /tmp/optimize.sql; – 2010-05-26 13:11:26

1

没关系,这是一个老帖子,但这是必要的。

菲尔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 

,这是所有。 现在已经在很多服务器上使用它了。