MySQL一時テーブル(内部および外部)を理解する

一時テーブル

名前が示すように、一時テーブルはデータを一時的に保存するために使用されるテーブルであり、システムの一時フォルダに組み込まれたテーブルです。適切に使用すれば、通常のテーブルと同様にさまざまな操作を実行できます。

中間結果セットを格納するために一時テーブルを使用することがよくあります。リソースを大量に消費するクエリを実行する必要がある場合、または大きなテーブルを複数回操作する必要がある場合は、中間結果または小さなサブセットを一時テーブルに配置してから、これらのテーブルにクエリを実行してクエリの効率を向上させることができます。一時テーブルは主に、データを一時的に保存する必要がある一部のシナリオに適しています。

通常の状況では、一時テーブルは通常、アプリケーションで動的に作成されるか、必要に応じてMySQLによって作成されます。一時テーブルは、内部一時テーブルと外部一時テーブルに分けることができます。

外部一時テーブル

外部一時テーブルは、セッション一時テーブルと呼ぶこともできます。この一時テーブルは現在のユーザーにのみ表示され、そのデータとテーブル構造はメモリに保存されます。現在のセッションが中断または終了すると、データテーブルのデータは失われ、MySQLは自動的にテーブルを削除して、占有されているスペースを解放します。
1)
一時テーブルを作成します。一時テーブルは簡単に作成できます。次に示すように、CREATETABLEステートメントにTEMPORARYキーワードを追加します。

CREATE TEMPORARY TABLE <表名>...

一時テーブルには、非一時テーブルと同じ名前を付けることができますが、同じ名前を付けると、一時テーブルが削除されるまで、非一時テーブルは現在のセッションから見えなくなります。
2)
一時テーブルのクエリ一時テーブルの作成後、SHOW TABLESコマンドを実行しても一時テーブルは一覧表示されず、INFORMATION_SCHEMAデータベースに一時テーブル情報はありません。これはバグではありませんが、設計は次のようになります。

次のコマンドを使用して、一時テーブルを表示できます。

SHOW CREATE TABLE <表名>; 

3)一時テーブルを削除する
もちろん、現在のセッションで一時テーブルを手動で破棄することもできます。SQLステートメントは次のとおりです。

DROP TABLE <表名>;

例1
以下では、tmp_tableテーブルを作成し、それを操作します。

mysql> CREATE TEMPORARY TABLE tmp_table (
    -> id INT NOT NULL,
    -> name VARCHAR(10) NOT NULL);
Query OK, 0 rows affected (0.03 sec)

mysql> SHOW TABLES;
+-------------------+
| Tables_in_test    |
+-------------------+
| product           |
| product_price     |
| score             |
| student           |
| student_comment   |
| tb_student        |
| tb_student_course |
| tb_students_info  |
| tb_students_score |
| tb_usertest       |
+-------------------+
10 rows in set (0.01 sec)

mysql> SHOW CREATE TABLE tmp_table \G
*************************** 1. row ***************************
       Table: tmp_table
Create Table: CREATE TEMPORARY TABLE `tmp_table` (
  `id` int(11) NOT NULL,
  `name` varchar(10) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)

mysql> DROP TABLE tmp_table;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW CREATE TABLE tmp_table \G
ERROR 1146 (42S02): Table 'test.tmp_table' doesn't exist

DROP TABLEコマンドを実行する前に現在のMySQLセッションを終了し、SHOW CREATE TABLEコマンドを使用してtmp_tableテーブルを読み取ると、一時テーブルが破棄されたため、データベースにテーブルが存在しないことがわかります。セッションを終了します。

外部一時テーブルにもいくつかの制限があります。使用する場合は、次の点に注意してください
。1。使用するデータベースアカウントには、一時テーブルを作成および使用する権限が必要です
。2。同じ一時テーブルをで2回関連付けることはできません同じSQLステートメント
。3。使用できません。RENAMEを使用して一時テーブルの名前を変更します。代わりにALTERTABLEを使用できます。

内部一時テーブル

内部一時テーブルは、MySQLによって自動的に作成される手動一時テーブルとは異なる特別な軽量一時テーブルです。一時テーブルは、SQLの実行中に特定の操作の中間結果を格納するために使用できます。このプロセスはMySQLによって自動的に完了し、ユーザーが手動で介入することはできず、そのような内部テーブルはユーザーには表示されません。

EXPLAINまたはSHOWSTATUSを使用して、MySQLが内部一時テーブルを使用して操作を完了するかどうかを確認できます。

内部一時テーブルは、SQLステートメントの最適化において非常に重要な役割を果たします。MySQLの多くの操作は、最適化のために内部一時テーブルに依存しています。ただし、内部一時テーブルを使用するには、テーブルの作成と中間データアクセスのコストが必要になるため、ユーザーはSQLステートメントを作成するときに一時テーブルの使用を避けるようにしてください。

内部一時テーブルを生成するためのいくつかの可能性は次のとおりです
。1。ORDERBY/ GROUPBYを使用するすべての列がテーブル接続の最初のテーブルからのものであるとは限りません
2.DistinctとORDERBYが組み合わせて使用​​され
ます3.マルチテーブル接続を保存する必要があります中間結果セット

内部一時テーブルには2つのタイプがあります。1つはHEAP一時テーブルです。この一時テーブルのすべてのデータはメモリに保存されます。このテーブルの操作にはIO操作は必要ありません。もう1つは、名前が示すようにOnDisk一時テーブルです。 、この一時テーブルはデータをディスクに保存します。OnDisk一時テーブルは、比較的大きな中間結果を持つ操作を処理するために使用されます。

次の状況では、MySQLがHEAP一時テーブルを使用できず、代わりにOnDisk一時テーブルを使用する場合があります。

1.データテーブルには、BLOBタイプまたはTEXTタイプのフィールド列が含まれています。

2. GROUP BYまたはDISTINCTの条件には、512バイトを超える列が含まれています。

3.UNIONまたはUNIONALLが使用され、SELECT列に512バイトを超える列が含まれている場合。

4. HEAP一時テーブルのサイズがMAX_HEAP_TABLE_SIZEシステム変数の値より大きい場合、HEAP一時テーブルは自動的にOnDisk一時テーブルに変換されます。

MySQL 5.7 版本中,OnDisk 临时表可以通过 INTERNAL_TMP_DISK_STORAGE_ENGINE 系统变量选择使用 MyISAM 引擎或者 InnoDB 引擎。
Created_tmp_tables 和 Created_tmp_disk_tables 变量用来记录所用临时表的数目。

おすすめ

転載: blog.csdn.net/qq_36551991/article/details/111145516