MySQLのイベントスケジューラでFLUSH QUERY CACHE

MySQLのイベントスケジューラは事前に登録したスクリプトを自動で実行したり、定期的に実行したりすることができます。

「FLUSH QUERY CACHE」はクエリキャッシュのメモリ領域をデフラグメント化します。クエリキャッシュをデフラグメント化することによってメモリの使用効率を良くすることができます。

両者の機能を使って幸せになろうという話。

イベントスケジューラを有効にする

まずイベントスケジューラを使用するにはmy.cnfに以下の様に設定します。

[mysqld]
event-scheduler=ON

既にMySQLデーモンを起動中の場合は、mysqlコンソールから以下のように設定することもできます。

mysql> SET GLOBAL event_scheduler=1;
Query OK, 0 rows affected (0.00 sec)

イベントスケジューラが有効になれば、専用のスレッドが起動しているのが確認できると思います。

mysql> show processlist\G
*************************** 1. row ***************************
     Id: 1
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: init
   Info: show processlist
*************************** 2. row ***************************
     Id: 2
   User: event_scheduler
   Host: localhost
     db: NULL
Command: Daemon
   Time: 91
  State: Waiting on empty queue
   Info: NULL
2 rows in set (0.00 sec)

以上でイベントスケジューラが使用できるようになりました。

FLUSH QUERY CACHEをイベントスケジューラに登録

mysql> CREATE EVENT flush_query_cache
    -> ON SCHEDULE EVERY 1 DAY STARTS '2014-05-12 03:00:00'
    -> ENABLE
    -> DO FLUSH QUERY CACHE;
Query OK, 0 rows affected (0.12 sec)

上記CREATE EVENTコマンドを実行。一応STARTSの時間は負荷の少ない時間を指定しています。これで深夜03:00に毎日「FLUSH QUERY CACHE」が実行されます。

DO のあとにBGIN 〜 ENDを指定することで複数のクエリを指定することもできます。以下の様な感じで。

DELIMITER //
CREATE EVENT flush_query_cache
ON SCHEDULE EVERY 1 DAY STARTS '2014-05-12 03:00:00'
ENABLE
DO
BEGIN
    FLUSH QUERY CACHE;
    FLUSH QUERY CACHE;
END //
DELIMITER ;

登録したイベントを確認する

登録したイベント情報を確認するには「SHOW EVENTS」コマンドで確認することができます。

mysql> SHOW EVENTS\G
*************************** 1. row ***************************
                  Db: test
                Name: flush_query_cache
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: DAY
              Starts: 2014-05-12 03:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: utf8mb4_general_ci
1 row in set (0.00 sec)

更に詳細なデータを確認したい場合は、information_schemaから直接SELECTすることもできます。

mysql> SELECT * FROM information_schema.EVENTS\G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: test
          EVENT_NAME: flush_query_cache
             DEFINER: root@localhost
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: FLUSH QUERY CACHE
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 1
      INTERVAL_FIELD: DAY
            SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
              STARTS: 2014-05-13 09:40:57
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2014-05-11 22:44:35
        LAST_ALTERED: 2014-05-11 22:44:35
       LAST_EXECUTED: NULL
       EVENT_COMMENT: 
          ORIGINATOR: 1
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_general_ci
  DATABASE_COLLATION: utf8mb4_general_ci
1 row in set (0.00 sec)

information_schemaから直接SELECTした場合は、実行するSQL文(EVENT_DEFINITION)や、最後にイベントを実行した時間(LAST_EXECUTED)を確認することができます。

登録したイベントを削除する

イベントを削除するには「DROP EBENT イベント名」で削除できます。

mysql> DROP EVENT flush_query_cache;
Query OK, 0 rows affected (0.00 sec)

感想

まあ、正直これでぐらいで幸せレベルが上がるかどうかは不明ですが、MySQL5.6からInnoDBはALTER TEBLE中もDML(SELECT,INSERT,UPDTE,DELETE)可能との事のなので、MySQL5.6であればInnoDBのデフラグをイベントスケジューラでやってみてもいいかも。

DELIMITER //
CREATE EVENT flush_query_cache
ON SCHEDULE EVERY 1 DAY STARTS '2014-05-12 03:00:00'
ENABLE
DO
BEGIN
    ALTER TABLE `テーブル名1` ENGINE InnoDB;
    ALTER TABLE `テーブル名2` ENGINE InnoDB;
END //
DELIMITER ;

これが不幸の道につながらなければいいのですが。。。いずれ検証して見たいと思います。

コメントを残す