HEAP
テーブルは、ハッシュインデックスを使用し、メモリに格納されます。これによって処理は速くなりますが、MySQL
がクラッシュすると、このテーブルに格納されたすべてのデータが失われます。HEAP
は、テンポラリテーブルとして非常に便利です。
MySQL の内部 HEAP
テーブルは、オーバフローエリアなしの 100%
動的ハッシュを使用します。フリーリスト用の余分な領域は必要ありません。また、HEAP
テーブルでは、ハッシュテーブルで一般に見られる削除
+ 挿入に伴う問題も起こりません。
mysql>CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) AS down
->FROM log_table GROUP BY ip;
mysql>SELECT COUNT(ip),AVG(down) FROM test;
mysql>DROP TABLE test;
次に、HEAP
テーブルを使用する際の考慮事項を示します。
誤ってメモリを使い切ることがないように、CREATE
ステートメントには必ず MAX_ROWS
を指定する。
インデックスには =
と
<=>
しか使用できない(その代わりきわめて高速)。
HEAP
テーブルでは、レコードの検索にキー全体を使用するしかない。一方
MyISAM
テーブルでは、キーの任意のプリフィックスを使ってレコードを検索できる。
HEAP
テーブルは、固定レコード長形式を使用する。
HEAP
は、BLOB
カラムと TEXT
カラムをサポートしない。
HEAP
は、AUTO_INCREMENT
カラムをサポートしない。
MySQL 4.0.2
より前のバージョンでは、HEAP
が NULL
カラムのインデックスをサポートしない。
HEAP
テーブルでは一意でないキーを使用できる(ハッシュテーブルではあまり使用されない)。
HEAP
テーブルは、他のテーブルと同様にすべてのクライアント間で共有される。
次のエントリを順番に検索できない(つまり、インデックスを使って
ORDER BY
を実行できない)。
HEAP
テーブルのデータは、小さなブロックで割り当てられる。テーブルは
100%
動的である(挿入時)。オーバフローエリアも余分なキースペースも必要ない。削除されたレコードはリンクされたリストに保存され、新しいデータをテーブルに挿入する際に再使用される。
同時に使用するすべての HEAP
テーブルに対して十分な追加メモリが必要。
メモリを解放するには、DELETE FROM
heap_table
、TRUNCATE
heap_table
、または DROP TABLE
heap_table
を実行する必要がある。
MySQL では、2
つの値の間に存在するおおよそのレコード数を確認できない(この値は、使用するインデックスを範囲オプティマイザが決定するために使用する)。MyISAM
テーブルを HEAP
テーブルに変更すると、この点が一部のクエリに影響する可能性がある。
誤った操作を行わないように、max_heap_table_size
より大きなサイズの HEAP
テーブルは作成できないようになっている。
HEAP
テーブルで 1
つのレコードに必要なメモリは、次のように計算します。
SUM_OVER_ALL_KEYS(キーの最大長 + sizeof(char*) * 2) + ALIGN(レコードの長さ+1, sizeof(char*))
sizeof(char*)
は、32 ビットマシンでは
4、64 ビットマシンでは 8 です。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.