我一直在仔细阅读http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html以找出如何优化myisam的所有表,但似乎没有得到它。我找到了一个看起来像手稿的东西,但我不能让它工作,我宁愿真正理解它。
这就是我遇到的:
for i in mysql -e 'select concat(table_schema,".",table_name) from information_schema.tables where engine="MyISAM"'; do mysql -e "optimize table $i"; done
但是如果能按照文档中描述的方式使用更多的东西,比如mysqloptimize --all-databases,那就太好了,但我绝对不希望它试图优化我的innodb表。
有什么线索吗?
谢谢

最佳答案

可以使用存储例程优化表。但是,显然,这需要运行mysql服务。存储例程的示例如下所示。此过程中定义的游标从当前数据库(其中定义了此SP)中选择所有表。您可以添加检查myisam表的条件,条件位于以下位置,如示例所示:

DELIMITER //
CREATE PROCEDURE util_optimize_all_tables()
SQL SECURITY INVOKER
BEGIN
    DECLARE endloop INT DEFAULT 0;
    DECLARE tableName CHAR(100);
    DECLARE rCursor CURSOR FOR SELECT `TABLE_NAME`
        FROM `information_schema`.`TABLES`
        WHERE `TABLE_SCHEMA` = DATABASE() AND `ENGINE`='MyISAM';
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET endloop = 1;

    OPEN rCursor;
    FETCH rCursor INTO tableName;

    WHILE endloop = 0 DO
        SET @sql = CONCAT('OPTIMIZE TABLE `', tableName, '`;');
        PREPARE statement FROM @sql;
        EXECUTE statement;

        FETCH rCursor INTO tableName;
    END WHILE;

    CLOSE rCursor;
END//
DELIMITER ;

10-04 11:03
查看更多