DROP PROCEDURE IF EXISTS optimize_tables; 
DELIMITER // 
CREATE PROCEDURE optimize_tables(db_name VARCHAR(64)) 
BEGIN 
   DECLARE t VARCHAR(64); 
   DECLARE done INT DEFAULT 0; 
   DECLARE c CURSOR FOR 
      SELECT table_name FROM INFORMATION_SCHEMA.TABLES 
      WHERE TABLE_SCHEMA = db_name AND TABLE_TYPE = 'BASE TABLE'; 
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 
   OPEN c; 
   tables_loop: LOOP 
      FETCH c INTO t; 
      IF done THEN 
         CLOSE c; 
         LEAVE tables_loop; 
      END IF; 
      SET @stmt_text := CONCAT("OPTIMIZE TABLE ", db_name, ".", t); 
      PREPARE stmt FROM @stmt_text; 
      EXECUTE stmt; 
      DEALLOCATE PREPARE stmt; 
   END LOOP; 
   CLOSE c; 
END// 
DELIMITER ;

