一時テーブル
一時テーブル機能は、TiDBv5.3.0で導入されました。この機能は、アプリケーションの中間結果を一時的に保存する問題を解決します。これにより、テーブルを頻繁に作成および削除する必要がなくなります。中間計算データを一時テーブルに保存できます。中間データが不要になると、TiDBは一時テーブルを自動的にクリーンアップしてリサイクルします。これにより、ユーザーアプリケーションが複雑になりすぎるのを防ぎ、テーブル管理のオーバーヘッドを減らし、パフォーマンスを向上させます。
このドキュメントでは、ユーザーシナリオと一時テーブルの種類を紹介し、使用例と一時テーブルのメモリ使用量を制限する方法について説明し、他のTiDB機能との互換性の制限について説明します。
ユーザーシナリオ
次のシナリオでTiDB一時テーブルを使用できます。
- アプリケーションの中間一時データをキャッシュします。計算が完了すると、データは通常のテーブルにダンプされ、一時テーブルは自動的に解放されます。
- 短時間で同じデータに対して複数のDML操作を実行します。たとえば、eコマースショッピングカートアプリケーションでは、商品の追加、変更、削除、支払いの完了、ショッピングカート情報の削除を行います。
- 中間一時データをバッチですばやくインポートして、一時データのインポートのパフォーマンスを向上させます。
- データをバッチで更新します。データをデータベースの一時テーブルにバッチでインポートし、データの変更が完了した後、データをファイルにエクスポートします。
一時テーブルの種類
TiDBの一時テーブルは、ローカル一時テーブルとグローバル一時テーブルの2つのタイプに分けられます。
- ローカル一時テーブルの場合、テーブル定義とテーブル内のデータは、現在のセッションにのみ表示されます。このタイプは、セッションに中間データを一時的に保存するのに適しています。
- グローバル一時テーブルの場合、テーブル定義はTiDBクラスタ全体に表示され、テーブル内のデータは現在のトランザクションにのみ表示されます。このタイプは、トランザクションで中間データを一時的に保存するのに適しています。
ローカル一時テーブル
TiDBのローカル一時テーブルのセマンティクスは、MySQL一時テーブルのセマンティクスと一致しています。特徴は次のとおりです。
- ローカル一時テーブルのテーブル定義は永続的ではありません。ローカル一時テーブルは、テーブルが作成されたセッションにのみ表示され、他のセッションはテーブルにアクセスできません。
- 異なるセッションで同じ名前のローカル一時テーブルを作成できます。各セッションは、セッションで作成されたローカル一時テーブルからの読み取りと書き込みのみを行います。
- ローカル一時テーブルのデータは、セッション内のすべてのトランザクションに表示されます。
- セッションが終了すると、セッションで作成されたローカル一時テーブルは自動的に削除されます。
- ローカル一時テーブルは、通常のテーブルと同じ名前にすることができます。この場合、DDLおよびDMLステートメントでは、ローカル一時テーブルが削除されるまで、通常のテーブルは非表示になります。
ローカル一時テーブルを作成するには、 CREATE TEMPORARY TABLEステートメントを使用できます。ローカル一時テーブルを削除するには、 DROP TABLEまたはDROP TEMPORARY TABLEステートメントを使用できます。
MySQLとは異なり、TiDBのローカル一時テーブルはすべて外部テーブルであり、SQLステートメントの実行時に内部一時テーブルが自動的に作成されることはありません。
ローカル一時テーブルの使用例
ノート:
- TiDBで一時テーブルを使用する前に、 他のTiDB機能との互換性の制限とMySQL一時テーブルとの互換性に注意してください。
- TiDB v5.3.0より前のクラスタでローカル一時テーブルを作成した場合、これらのテーブルは実際には通常のテーブルであり、クラスタがTiDBv5.3.0以降のバージョンにアップグレードされた後は通常のテーブルとして扱われます。
通常のテーブルがあると仮定しますusers :
CREATE TABLE users (
id BIGINT,
name VARCHAR(100),
PRIMARY KEY(id)
);
セッションAでは、ローカル一時テーブルusersを作成しても、通常のテーブルusersと競合しません。セッションAがusersテーブルにアクセスすると、ローカル一時テーブルusersにアクセスします。
CREATE TEMPORARY TABLE users (
id BIGINT,
name VARCHAR(100),
city VARCHAR(50),
PRIMARY KEY(id)
);
Query OK, 0 rows affected (0.01 sec)
usersにデータを挿入すると、セッションAのローカル一時テーブルusersにデータが挿入されます。
INSERT INTO users(id, name, city) VALUES(1001, 'Davis', 'LosAngeles');
Query OK, 1 row affected (0.00 sec)
SELECT * FROM users;
+------+-------+------------+
| id | name | city |
+------+-------+------------+
| 1001 | Davis | LosAngeles |
+------+-------+------------+
1 row in set (0.00 sec)
セッションBでは、ローカル一時テーブルusersを作成しても、セッションAの通常のテーブルusersまたはローカル一時テーブルusersと競合しません。セッションBがusersテーブルにアクセスすると、セッションBのローカル一時テーブルusersにアクセスします。
CREATE TEMPORARY TABLE users (
id BIGINT,
name VARCHAR(100),
city VARCHAR(50),
PRIMARY KEY(id)
);
Query OK, 0 rows affected (0.01 sec)
usersにデータを挿入すると、セッションBのローカル一時テーブルusersにデータが挿入されます。
INSERT INTO users(id, name, city) VALUES(1001, 'James', 'NewYork');
Query OK, 1 row affected (0.00 sec)
SELECT * FROM users;
+------+-------+---------+
| id | name | city |
+------+-------+---------+
| 1001 | James | NewYork |
+------+-------+---------+
1 row in set (0.00 sec)
MySQL一時テーブルとの互換性
TiDBローカル一時テーブルの次の機能と制限は、MySQL一時テーブルと同じです。
- ローカル一時テーブルを作成または削除しても、現在のトランザクションは自動的にコミットされません。
- ローカル一時テーブルが配置されているスキーマを削除した後、一時テーブルは削除されず、読み取りと書き込みが可能です。
- ローカル一時テーブルを作成するには、
CREATE TEMPORARY TABLESの権限が必要です。テーブルに対する後続のすべての操作には、許可は必要ありません。 - ローカル一時テーブルは、外部キーとパーティションテーブルをサポートしていません。
- ローカル一時テーブルに基づくビューの作成はサポートされていません。
SHOW [FULL] TABLESはローカル一時テーブルを表示しません。
TiDBのローカル一時テーブルは、次の点でMySQL一時テーブルと互換性がありません。
- TiDBローカル一時テーブルは
ALTER TABLEをサポートしていません。 - TiDBローカル一時テーブルは
ENGINEテーブルオプションを無視し、一時テーブルデータを常にメモリ制限でTiDBメモリに保存します。 - ストレージエンジンとして
MEMORYが宣言されている場合、TiDBローカル一時テーブルはMEMORYストレージエンジンによって制限されません。 INNODBまたはMYISAMがストレージエンジンとして宣言されている場合、TiDBローカル一時テーブルはInnoDB一時テーブルに固有のシステム変数を無視します。- MySQLは、同じSQLステートメントで同じ一時テーブルを複数回参照することを許可していません。 TiDBローカル一時テーブルにはこの制限はありません。
- MySQLの一時テーブルを示すシステムテーブル
information_schema.INNODB_TEMP_TABLE_INFOはTiDBに存在しません。現在、TiDBにはローカル一時テーブルを表示するシステムテーブルがありません。 - TiDBには内部一時テーブルがありません。内部一時テーブルのMySQLシステム変数は、TiDBでは有効になりません。
グローバル一時テーブル
グローバル一時テーブルはTiDBの拡張です。特徴は次のとおりです。
- グローバル一時テーブルのテーブル定義は永続的であり、すべてのセッションに表示されます。
- グローバル一時テーブルのデータは、現在のトランザクションでのみ表示されます。トランザクションが終了すると、データは自動的にクリアされます。
- グローバル一時テーブルに通常のテーブルと同じ名前を付けることはできません。
グローバル一時テーブルを作成するには、 ON COMMIT DELETE ROWSで終わるCREATE GLOBAL TEMPORARY TABLEステートメントを使用できます。グローバル一時テーブルを削除するには、 DROP TABLEまたはDROP GLOBAL TEMPORARY TABLEステートメントを使用できます。
グローバル一時テーブルの使用例
ノート:
- TiDBで一時テーブルを使用する前に、 他のTiDB機能との互換性の制限に注意してください。
- v5.3.0以降のTiDBクラスタでグローバル一時テーブルを作成した場合、クラスタがv5.3.0より前のバージョンにダウングレードされると、これらのテーブルは通常のテーブルとして処理されます。この場合、データエラーが発生します。
セッションAでグローバル一時テーブルusersを作成します。
CREATE GLOBAL TEMPORARY TABLE users (
id BIGINT,
name VARCHAR(100),
city VARCHAR(50),
PRIMARY KEY(id)
) ON COMMIT DELETE ROWS;
Query OK, 0 rows affected (0.01 sec)
usersに書き込まれたデータは、現在のトランザクションに表示されます。
BEGIN;
Query OK, 0 rows affected (0.00 sec)
INSERT INTO users(id, name, city) VALUES(1001, 'Davis', 'LosAngeles');
Query OK, 1 row affected (0.00 sec)
SELECT * FROM users;
+------+-------+------------+
| id | name | city |
+------+-------+------------+
| 1001 | Davis | LosAngeles |
+------+-------+------------+
1 row in set (0.00 sec)
トランザクションが終了すると、データは自動的にクリアされます。
COMMIT;
Query OK, 0 rows affected (0.00 sec)
SELECT * FROM users;
Empty set (0.00 sec)
セッションAでusersが作成された後、セッションBは3テーブルからの読み取りとusersテーブルへの書き込みもできます。
SELECT * FROM users;
Empty set (0.00 sec)
ノート:
トランザクションが自動的にコミットされる場合、SQLステートメントが実行された後、挿入されたデータは自動的にクリアされ、後続のSQL実行で使用できなくなります。したがって、自動コミット以外のトランザクションを使用して、グローバル一時テーブルの読み取りと書き込みを行う必要があります。
一時テーブルのメモリ使用量を制限する
テーブルを定義するときにどのストレージエンジンがENGINEとして宣言されていても、ローカル一時テーブルとグローバル一時テーブルのデータはTiDBインスタンスのメモリにのみ保存されます。このデータは永続化されません。
メモリオーバーフローを回避するために、 tidb_tmp_table_max_sizeのシステム変数を使用して各一時テーブルのサイズを制限できます。一時テーブルがtidb_tmp_table_max_sizeしきい値より大きくなると、TiDBはエラーを報告します。デフォルト値のtidb_tmp_table_max_sizeは64MBです。
たとえば、一時テーブルの最大サイズを256MBに設定します。
SET GLOBAL tidb_tmp_table_max_size=268435456;
他のTiDB機能との互換性の制限
TiDBのローカル一時テーブルとグローバル一時テーブルは、次のTiDB機能と互換性がありません。
AUTO_RANDOM列SHARD_ROW_ID_BITSおよびPRE_SPLIT_REGIONSテーブルオプション- パーティションテーブル
SPLIT REGIONステートメントADMIN CHECK TABLEおよびADMIN CHECKSUM TABLEステートメントFLASHBACK TABLEおよびRECOVER TABLEステートメント- 一時テーブルに基づいて
CREATE TABLE LIKEのステートメントを実行する - 古い読み取り
- 外部キー
- SQLバインディング
- TiFlashレプリカ
- 一時テーブルにビューを作成する
- 配置ルール
- 一時テーブルを含む実行プランは
prepare plan cacheによってキャッシュされません。
TiDBのローカル一時テーブルは、次の機能をサポートしていません。
tidb_snapshotのシステム変数を使用して履歴データを読み取ります。
TiDB移行ツールのサポート
ローカル一時テーブルは、現在のセッションにのみ表示されるため、TiDB移行ツールによってエクスポート、バックアップ、または複製されません。
テーブル定義はグローバルに表示されるため、グローバル一時テーブルはTiDB移行ツールによってエクスポート、バックアップ、および複製されます。テーブルのデータはエクスポートされないことに注意してください。
ノート:
- TiCDCを使用して一時テーブルを複製するには、TiCDCv5.3.0以降が必要です。そうでない場合、ダウンストリームテーブルのテーブル定義が間違っています。
- BRを使用して一時テーブルをバックアップするには、BRv5.3.0以降が必要です。そうしないと、バックアップされた一時テーブルのテーブル定義が間違っています。
- エクスポートするクラスタ、データ復元後のクラスタ、およびレプリケーションのダウンストリームクラスタは、グローバル一時テーブルをサポートする必要があります。それ以外の場合は、エラーが報告されます。