【问题标题】:Mysql OPTIMIZE TABLE for all fragmented tablesMysql OPTIMIZE TABLE 用于所有碎片表
【发布时间】:2010-11-05 03:17:01
【问题描述】:

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

是否可以在 SQL 的一个命令中优化具有此属性的所有表,还是我必须编写外部代码才能做到这一点?

【问题讨论】:

    标签: mysql optimization fragmentation defragmentation


    【解决方案1】:

    我知道有答案。但是 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

    【讨论】:

      【解决方案2】:

      好的,这是一个旧帖子,但这是必需的。

      菲尔·杜福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
      

      仅此而已。 已经在多台服务器上使用它一段时间了。

      【讨论】:

        【解决方案3】:

        你可以这样做:

        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;
        

        【讨论】:

        • 对我来说需要做些小改动,但方法很好。 SELECT concat("OPTIMIZE TABLE ", table_schema,".",table_name,";") FROM information_schema.tables WHERE DATA_FREE > 0 INTO OUTFILE '/tmp/optimize.sql';源 /tmp/optimize.sql;
        • 你需要在 table_schema 和 table_name 周围加上一些反引号,否则我欠你一杯啤酒,非常感谢。
        猜你喜欢
        • 2018-07-12
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 2016-01-19
        相关资源
        最近更新 更多