場合によっては、サーバーはクエリーの処理中に内部一時テーブルを作成することがあります。一時テーブルは、メモリー内に保持して
MEMORY
ストレージエンジンで処理するか、ディスクに格納して
MyISAM
ストレージエンジンで処理することができます。一時テーブルは、次のような条件で作成されることがあります。
ORDER BY
節とそれと異なる GROUP
BY
節がある場合、あるいは、ORDER
BY
または GROUP
BY
に結合キューの第 1
テーブルとは異なるテーブルのカラムが含まれている場合は、一時テーブルが作成される。
SQL_SMALL_RESULT
を使用する場合、MySQL
ではメモリー内の一時テーブルが使用される。
DISTINCT
と
ORDER BY
の組み合わせで、一時テーブルが必要になることがあります。
クエリーに一時テーブルが必要かどうかを調べるには、EXPLAIN
を使用して Extra
カラムに Using temporary
と表示されるかどうかを確認します。項4.2.1. 「EXPLAIN
を使用して、クエリーを最適化する」
を参照してください。
条件によっては MEMORY
一時テーブルを使用できないことがあり、その場合サーバーは
MyISAM
テーブルを代わりに使用します。
テーブルに
TEXT
または
BLOB
カラムが含まれている場合
GROUP BY
または
DISTINCT
節に 512
バイトを超えるカラムが含まれている場合
UNION
または
UNION
ALL
を使用する場合で、SELECT
リストに 512
バイトを超えるカラムが含まれているとき
最初は MEMORY
テーブルとして作成された一時テーブルが大きくなりすぎた場合、MyISAM
テーブルに変換されてディスクに格納される場合があります。max_heap_table_size
システム変数によって
MEMORY
テーブルの最大サイズが決まります。これは、CREATE
TABLE
で作成されたテーブルも含め、すべての
MEMORY
テーブルに適用されます。ただし、内部
MEMORY
テーブルの場合、実際の最大サイズは
max_heap_table_size
と
tmp_table_size
の組み合わせで決まります。このうち、小さい方の値が適用されます。内部
MEMORY
テーブルのサイズが制限を超えると、MySQL
は自動的にディスク上の
MyISAM
テーブルに変換します。