我想OPTIMIZE
所有当前碎片化的表格。这些表格应为information_schema.DATA_FREE > 0
。
是否可以在SQL中的一个命令中使用此属性优化所有表,或者我是否必须编写外部代码才能执行此操作?
答案 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