MySQL / MariaDB事件优化数据库表

时间:2016-01-11 13:37:23

标签: mysql mariadb mysql-event

我有兴趣创建一个定期事件,以便每晚优化我的数据库表。

我到了SELECT Concat('OPTIMIZE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='database_name';。如何在MySQL事件中执行每一行?

我更喜欢使用MySQL / MariaDB事件而不涉及bash。谢谢!

2 个答案:

答案 0 :(得分:1)

所以,这是你的查询。你只需要改变SELECT语句然后就可以调用它

ELIMITER //
CREATE PROCEDURE p1()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE val VARCHAR(2000);
  DECLARE curs CURSOR FOR SELECT sqlstring FROM table_a;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN curs;

  read_loop: LOOP
    FETCH curs INTO val;
    IF done THEN
      LEAVE read_loop;
    END IF;

  SET @sql := val;
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

  END LOOP;

  CLOSE curs;
END; //

DELIMITER ;

称之为

调用p1();

答案 1 :(得分:0)

管理以使其运行:

BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE val VARCHAR(2000);
  DECLARE curs CURSOR FOR SELECT Concat('OPTIMIZE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='database_name';

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN curs;

  read_loop: LOOP
    FETCH curs INTO val;
    IF done THEN
      LEAVE read_loop;
    END IF;

  SET @sql := val;
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

  END LOOP;

  CLOSE curs;
END