mysqlcheck with --optimize但仅适用于MyISAM表

时间:2012-09-04 12:09:29

标签: mysql relational-database myisam

我一直在阅读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表。

任何指针?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用存储的例程来优化表。但是,显然,这需要运行mysql服务。存储例程的样本如下所示。此过程中定义的游标选择当前db(定义此sp)中的所有表。您可以在WHERE中添加条件以检查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 ;
相关问题