English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
派生テーブルについて
主クエリに派生テーブルが含まれている場合、またはselect文にunion文が含まれている場合、またはselect文に一つのフィールドのorder by子句(別のフィールドのgroup by子句に対して)が含まれている場合、MySQLはクエリを完了するために自動的にテンポラリーテーブルを作成して一時的な結果セットを格納します。このようなテンポラリーテーブルはMySQLが自動的に作成し、メンテナンスし、自動作成のテンポラリーテーブルとなります。自動作成のテンポラリーテーブルについては、メモリテンポラリーテーブルのパフォーマンスが優れているため、mysqlは常にメモリテンポラリーテーブルを使用します。メモリテンポラリーテーブルが大きくなると、ある閾値に達すると、メモリテンポラリーテーブルはディスクテンポラリーテーブルに転送されます。つまり、ディスクテンポラリーテーブルはメモリテンポラリーテーブルのストレージ空間の延長となります。メモリテンポラリーテーブルがディスクテンポラリーテーブルに転送される閾値は、システム変数max_heap_table_sizeとtmp_table_sizeの小さい方の値で決定されます。
派生テーブルは、from子句で一般的に使用されます。例えば:
select * from (select * from table) as t;
テンポラリーテーブルについて
非常に大きなテーブルで作業している場合、時々、大量のデータの小さなサブセットを取得するために多くのクエリを実行する必要があるかもしれません。これらのクエリをテーブル全体に対して実行するのではなく、MySQLが一度に必要な少数のレコードを見つけるようにし、それらのレコードを選択してテンポラリーテーブルに格納することが、より速く実行されるかもしれません。その後、これらのテーブルに対してクエリを実行します。
テンポラリーテーブルを作成するのは簡単です。通常のCREATE TABLE文にTEMPORARYキーワードを追加します:
CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL value INTEGER NOT NULL )
テンポラリーテーブルは、あなたがMySQLに接続している間存在します。接続を切ると、MySQLは自動的にテーブルを削除し、使用していた空間を解放します。もちろん、接続している間にテーブルを削除して空間を解放することもできます。
DROP TABLE tmp_table
もし、tmp_tableという名前のテンポラリーテーブルを作成している際に、tmp_tableという名前のテーブルがデータベースに既に存在している場合、テンポラリーテーブルは非テンポラリーテーブルのtmp_tableを隠す必要があります。
一時テーブルをHEAPテーブルとして宣言した場合、MySQLはメモリ内でその作成を許可します:
CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL value INTEGER NOT NULL ) TYPE = HEAP
HEAPテーブルはメモリ内に保存されるため、メモリ内のテーブルに対して実行するクエリはディスク上の一時テーブルよりも少し速くなるかもしれません。しかし、HEAPテーブルは一般的なテーブルとは異なり、独自の制限があります。詳細はMySQL参考マニュアルを参照してください。
前述のアドバイスに従って、一時テーブルをテストして、大量のデータベースに対してクエリが本当に高速かどうかを確認してください。データがよく索引されている場合、一時テーブルはほとんど速くはなりません。
1一時テーブルはMySQLの接続を切断すると、システムが自動的にデータを削除しますが、これは以下の文法で作成されたテーブルに限られます:
フィールドの定義:
CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL value INTEGER NOT NULL )
2) 検索結果を一時テーブルに直接インポートします
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
2また、MySQLはメモリ内で直接一時テーブルを作成することを許可しています。メモリ内で作成されるため、速度が非常に速くなります。以下の文法を使用します:
CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL value INTEGER NOT NULL ) TYPE = HEAP
3上記の分析から、一時テーブルのデータはクリアされます。接続を切断すると自動的にクリアされますが、プログラムではSQLを実行するたびにデータベースに接続することはできません(もしそうであれば、心配する問題が発生しますが、そうでない場合は問題ありません)。なぜなら、データベース接続を切断することでデータがクリアされるため、一つのデータベース接続内で複数回SQLを実行すると、システムは一時テーブルのデータを自動的にクリアしません。
声明:本文内容はインターネットから取得しており、著作権者に帰属します。コンテンツはインターネットユーザーにより自発的に提供され、アップロードされています。このウェブサイトは所有権を有しておらず、人工編集は行われていません。著作権侵害が疑われる場合は、以下のメールアドレスにご連絡ください:notice#w3声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。コンテンツはインターネットユーザーにより自発的に提供され、アップロードされています。このウェブサイトは所有権を有しておらず、人工編集は行われていません。著作権侵害が疑われる場合は、以下のメールアドレスにご連絡ください:notice#w