MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

TTL(Time to Live)の対象となるMySQLレコードの作成方法|イベントスケジューラで自動削除を実現

MySQLデータベースでTTL(Time To Live:生存期間)を設定し、期限切れのレコードを自動的に削除したい場合は、MySQLイベントスケジューラ(Event Scheduler)を利用します。イベントスケジューラは、あらかじめ定義したスケジュールに従ってSQL処理を自動実行してくれる仕組みで、「毎日1回、有効期限を過ぎたレコードを削除する」といった運用を簡単に実現できます。

全体の流れ

  1. サンプル用のテーブルを作成する
  2. INSERT文でテストデータを登録する
  3. SELECT文で登録内容を確認する
  4. 毎日実行される削除イベント(CREATE EVENT)を作成する

手順1:サンプルテーブルを作成する

まずは動作確認用のテーブルを作成しましょう。Idカラムを主キー(AUTO_INCREMENT)、EventDateTimeカラムに日時を格納するシンプルな構造です。

mysql> create table EventDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EventDateTime datetime
-> );
Query OK, 0 rows affected (0.71 sec)

手順2:テーブルにレコードを挿入する

続いて、INSERT文を使って複数のレコードを登録します。

mysql> insert into EventDemo(EventDateTime) values('2010-09-21');
Query OK, 1 row affected (0.19 sec)
mysql> insert into EventDemo(EventDateTime) values('2016-10-27');
Query OK, 1 row affected (0.20 sec)
mysql> insert into EventDemo(EventDateTime) values('2018-12-09');
Query OK, 1 row affected (0.10 sec)
mysql> insert into EventDemo(EventDateTime) values('2019-03-12');
Query OK, 1 row affected (0.17 sec)
mysql> insert into EventDemo(EventDateTime) values('2019-01-04');
Query OK, 1 row affected (0.15 sec)

手順3:登録したレコードを確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select * from EventDemo;

実行結果は以下のとおりです。

+----+---------------------+
| Id | EventDateTime |
+----+---------------------+
| 1 | 2010-09-21 00:00:00 |
| 2 | 2016-10-27 00:00:00 |
| 3 | 2018-12-09 00:00:00 |
| 4 | 2019-03-12 00:00:00 |
| 5 | 2019-01-04 00:00:00 |
+----+---------------------+
5 rows in set (0.00 sec)

手順4:TTLの対象となる削除イベントを作成する

ここが本題です。CREATE EVENT文を使って、毎日1回自動実行されるイベントを定義します。この例では、EventDateTimeが現在時刻(NOW())より前、つまり有効期限が切れたレコードをすべて削除します。

mysql> delimiter //
mysql> CREATE EVENT
-> DeleteDemo
-> ON SCHEDULE EVERY 1 DAY
-> DO
-> BEGIN
-> DELETE FROM
-> EventDemo
-> WHERE EventDateTime < NOW();
-> END //
Query OK, 0 rows affected (0.31 sec)

ポイント解説

  • delimiter //:ストアドプロシージャやイベント内では複数のSQL文を扱うため、区切り文字を「//」に変更しています。定義後はdelimiter ;で元に戻すのが一般的です。
  • ON SCHEDULE EVERY 1 DAY:イベントを毎日1回実行するよう指定しています。「EVERY 1 HOUR」「EVERY 1 WEEK」など、目的に応じて間隔を変更できます。
  • WHERE EventDateTime < NOW():現在時刻より過去の日時を持つレコード、つまりTTLの有効期限が切れたレコードだけを削除対象にしています。

補足:イベントスケジューラが有効か確認しよう

イベントスケジューラが無効になっていると、作成したイベントは実行されません。以下のコマンドで状態を確認し、必要なら有効化してください。

-- 現在の状態を確認
mysql> SHOW VARIABLES LIKE 'event_scheduler';

-- イベントスケジューラを有効化
mysql> SET GLOBAL event_scheduler = ON;

このように、イベントスケジューラを活用すれば、アプリケーション側で定期バッチを組むことなく、MySQLだけでTTLベースのレコード自動削除を実装できます。ログやセッション情報など、保存期間が決まっているデータの管理にぜひ活用してください。

  1. MySQLコマンドラインでデータベースを作成する方法を初心者向けに解説

    MySQLコマンドラインでデータベースを作成する手順 この記事では、WindowsのコマンドプロンプトからMySQLに接続し、データベースを作成する一連の手順をスクリーンショット付きで解説します。初心者の方でも迷わず進められるよう、順番に見ていきましょう。 1. コマンドプロンプトを開く まず、コマンドプロンプトを起動します。キーボードのショートカット「Windows + R」キーを押すと、「ファイル名を指定して実行」ダイアログが表示されます。 2. 「CMD」と入力してOKをクリック 表示された入力欄に CMD と入力し、「OK」ボタンをクリックしてください。 3. コマンドプロンプトが

  2. MySQLでシーケンスを作成する方法|AUTO_INCREMENTの使い方とルールを解説

    MySQLにおけるシーケンスとは?MySQLにおける「シーケンス」とは、1(指定した場合は0)から始まり、昇順で自動生成される整数の連番のことです。多くのアプリケーションでは、レコードを一意に識別するための番号を発行する目的でシーケンスが利用されています。具体例代表的な例としては、CRMシステムの顧客ID、人事管理システムの社員番号、設備管理システムの機器番号などが挙げられます。MySQLでシーケンスを自動的に作成するには、対象のカラムにAUTO_INCREMENT属性を設定します。通常は、主キー(PRIMARY KEY)カラムに対して適用するのが一般的です。AUTO_INCREMENTを使用