2012-09-04 49 views
3

我一直在閱讀了http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html在努力弄清楚如何優化我所有的MyISAM表,但似乎無法得到它。我發現它看起來像是一個手稿,但我無法使它工作,我寧願真正理解它。mysqlcheck的與--optimize但只對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

您可以使用存儲的例程來優化表。但是,顯然,這需要運行mysql服務。存儲的例程示例如下所示。此過程中定義的遊標選擇當前數據庫中的所有表(其中定義了此sp)。您可以添加條件,在檢查MyISAM表與WHERE條件作爲例子:

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 ;