TTL (Time to Live) を使用して期限切れのデータを定期的に削除する

Time to Live (TTL) は、TiDB データの有効期間を行レベルで管理できるようにする機能です。 TTL 属性を持つテーブルの場合、TiDB はデータの有効期間を自動的にチェックし、期限切れのデータを行レベルで削除します。この機能により、storageスペースを効果的に節約し、一部のシナリオでパフォーマンスを向上させることができます。

次に、TTL の一般的なシナリオをいくつか示します。

  • 確認コードと短縮 URL を定期的に削除します。
  • 不要な履歴注文を定期的に削除します。
  • 計算の中間結果を自動的に削除します。

TTL は、ユーザーがオンラインの読み取りおよび書き込みワークロードに影響を与えることなく、不要なデータを定期的かつタイムリーにクリーンアップできるように設計されています。 TTL は、異なるジョブを異なる TiDB ノードに同時にディスパッチし、テーブル単位でデータを並列に削除します。 TTL は、有効期限が切れたすべてのデータがすぐに削除されることを保証するものではありません。つまり、一部のデータが期限切れになっていても、バックグラウンド TTL ジョブによってそのデータが削除されるまで、有効期限が切れた後もクライアントがそのデータを読み取る可能性があります。

構文

CREATE TABLEまたはALTER TABLEステートメントを使用して、テーブルの TTL 属性を構成できます。

TTL 属性を持つテーブルを作成する

  • TTL 属性を持つテーブルを作成します。

    CREATE TABLE t1 ( id int PRIMARY KEY, created_at TIMESTAMP ) TTL = `created_at` + INTERVAL 3 MONTH;

    前の例では、テーブルt1を作成し、データの作成時刻を示す TTL タイムスタンプ列としてcreated_atを指定します。この例では、行がテーブルに存在できる最長期間を 3 か月からINTERVAL 3 MONTHに設定しています。この値よりも長く存続するデータは後で削除されます。

  • TTL_ENABLE属性を設定して、期限切れデータのクリーンアップ機能を有効または無効にします。

    CREATE TABLE t1 ( id int PRIMARY KEY, created_at TIMESTAMP ) TTL = `created_at` + INTERVAL 3 MONTH TTL_ENABLE = 'OFF';

    TTL_ENABLEOFFに設定されている場合、他の TTL オプションが設定されていても、TiDB はこのテーブルの期限切れデータを自動的にクリーンアップしません。 TTL 属性を持つテーブルの場合、 TTL_ENABLEはデフォルトでONです。

  • MySQL との互換性を保つために、コメントを使用して TTL 属性を設定できます。

    CREATE TABLE t1 ( id int PRIMARY KEY, created_at TIMESTAMP ) /*T![ttl] TTL = `created_at` + INTERVAL 3 MONTH TTL_ENABLE = 'OFF'*/;

    TiDB では、テーブル TTL 属性を使用するか、コメントを使用して TTL を構成することは同等です。 MySQL ではコメントは無視され、通常のテーブルが作成されます。

テーブルの TTL 属性を変更する

  • テーブルの TTL 属性を変更します。

    ALTER TABLE t1 TTL = `created_at` + INTERVAL 1 MONTH;

    前述のステートメントを使用して、既存の TTL 属性を持つテーブルを変更したり、TTL 属性を持たないテーブルに TTL 属性を追加したりできます。

  • TTL 属性を持つテーブルの値をTTL_ENABLEに変更します。

    ALTER TABLE t1 TTL_ENABLE = 'OFF';
  • テーブルのすべての TTL 属性を削除するには:

    ALTER TABLE t1 REMOVE TTL;

TTL とデータ型のデフォルト値

TTL はデータ型のデフォルト値と一緒に使用できます。次に、2 つの一般的な使用例を示します。

  • 列のデフォルト値を現在の作成時刻として指定し、この列を TTL タイムスタンプ列として使用するには、 DEFAULT CURRENT_TIMESTAMPを使用します。 3 か月前に作成されたレコードは期限切れです。

    CREATE TABLE t1 ( id int PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) TTL = `created_at` + INTERVAL 3 MONTH;
  • 列のデフォルト値を作成時間または最新の更新時間として指定し、この列を TTL タイムスタンプ列として使用します。 3 か月間更新されていないレコードは期限切れになります。

    CREATE TABLE t1 ( id int PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) TTL = `created_at` + INTERVAL 3 MONTH;

TTL および生成列

TTL を生成された列 (実験的機能) と共に使用して、複雑な有効期限ルールを構成できます。例えば:

CREATE TABLE message ( id int PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, image bool, expire_at TIMESTAMP AS (IF(image, created_at + INTERVAL 5 DAY, created_at + INTERVAL 30 DAY )) ) TTL = `expire_at` + INTERVAL 0 DAY;

上記のステートメントは、 expire_at列を TTL タイムスタンプ列として使用し、メッセージ タイプに従って有効期限を設定します。メッセージが画像の場合、有効期限は 5 日です。それ以外の場合、有効期限は 30 日です。

JSON タイプとともに TTL を使用できます。例えば:

CREATE TABLE orders ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, order_info JSON, created_at DATE AS (JSON_EXTRACT(order_info, '$.created_at')) VIRTUAL ) TTL = `created_at` + INTERVAL 3 month;

TTL ジョブ

TTL 属性を持つテーブルごとに、TiDB は期限切れのデータをクリーンアップするバックグラウンド ジョブを内部的にスケジュールします。 tidb_ttl_job_run_intervalグローバル変数を設定することで、これらのジョブの実行期間をカスタマイズできます。次の例では、バックグラウンド クリーンアップ ジョブを 24 時間ごとに実行するように設定します。

SET @@global.tidb_ttl_job_run_interval = '24h';

TTL ジョブの実行を無効にするには、 TTL_ENABLE='OFF'テーブル オプションを設定するだけでなく、 tidb_ttl_job_enableグローバル変数を設定してクラスター全体で TTL ジョブの実行を無効にすることもできます。

SET @@global.tidb_ttl_job_enable = OFF;

シナリオによっては、特定の時間枠でのみ TTL ジョブの実行を許可したい場合があります。この場合、 tidb_ttl_job_schedule_window_start_timetidb_ttl_job_schedule_window_end_timeグローバル変数を設定して時間枠を指定できます。例えば:

SET @@global.tidb_ttl_job_schedule_window_start_time = '01:00 +0000'; SET @@global.tidb_ttl_job_schedule_window_end_time = '05:00 +0000';

上記のステートメントでは、TTL ジョブを UTC の 1:00 から 5:00 の間でのみスケジュールできます。デフォルトでは、時間枠は00:00 +0000から23:59 +0000に設定されており、ジョブをいつでもスケジュールできます。

指標とグラフの監視

TiDB は TTL に関するランタイム情報を定期的に収集し、Grafana でこれらのメトリックの視覚化されたグラフを提供します。これらのメトリックは、Grafana の TiDB -> TTL パネルで確認できます。

メトリックの詳細については、 TiDB 監視指標の TTL セクションを参照してください。

TiDB ツールとの互換性

実験的機能として、TTL 機能はBR、 TiDB Lightning、TiCDC などのデータのインポートおよびエクスポート ツールと互換性がありません。

制限事項

現在、TTL 機能には次の制限があります。

  • TTL 属性は、ローカル一時テーブルおよびグローバル一時テーブルを含む一時テーブルには設定できません。
  • TTL 属性を持つテーブルは、外部キー制約のプライマリ テーブルとして他のテーブルから参照されることをサポートしていません。
  • 期限切れのデータがすべてすぐに削除されることは保証されていません。期限切れのデータが削除される時間は、バックグラウンド クリーンアップ ジョブのスケジュール間隔とスケジュール ウィンドウによって異なります。
  • 現在、1 つのテーブルは、特定の時間に 1 つの TiDB ノードでのみクリーンアップ ジョブを実行できます。これは、一部のシナリオ (たとえば、テーブルが非常に大きい場合) でパフォーマンスのボトルネックを引き起こす可能性があります。この問題は、将来のリリースで最適化される予定です。

このページは役に立ちましたか?