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_ENABLE
がOFF
に設定されている場合、他の 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_time
とtidb_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 ノードでのみクリーンアップ ジョブを実行できます。これは、一部のシナリオ (たとえば、テーブルが非常に大きい場合) でパフォーマンスのボトルネックを引き起こす可能性があります。この問題は、将来のリリースで最適化される予定です。