はまった2

MySQLにはHEAPテーブルっちゅーメモリ上にデータを展開するデータストレージが用意されています。メモリ上にあるので、非常に高速にアクセスできます。もちろん制限がいくつかありますが。もちろん、いきなりMySQLが落ちてしまったら、ファイルには書き出してないので、再生不可能です。詳しくは"こちら"

なので用途としては、何かの処理の途中で必要となる一時データや、セッションデータなどで利用することになります。

ただ、HEAPテーブルはテーブルロックなので、セッションデータとして使う場合、実はそれ程良いレスポンスとは言えません。InnoDBの方がひょっとしたらいいかも。。。

ところで、そんなHEAPテーブルですが、MySQLのサイトや個人でMySQLについて解説されているサイトなどで、

誤ってメモリを使い切ることがないように、CREATE ステートメントには必ず MAX_ROWS を指定する。

と必ず書いてます。ところが別にこれ、そない神経質にやらんでもええような気がします。というのも、

誤った操作を行わないように、max_heap_table_size より大きなサイズの HEAP テーブルは作成できないようになっている。

となっているからです。このmax_heap_table_sizeのデフォルト値は16MBで、まぁメモリ16MBぐらいどってことないような気がしない?(^^;
しかもMAX_ROWSで指定した値って目安ぐらいにしか使用しない値となってて、実際はこの値より多くの行をINSERTできるようになってます(ソース見てないのでよくわからんけど、きっと2の累乗のサイズに一番近くなるような値に近づけてるんだと思う)

私はもっとサイズを大きくしたくなったので、その方法を備忘録がてら書いてみます。

MySQLを再起動させずに行う

set max_heap_table_size=40000000;
alter table some_heap_table max_rows=0;
↑約40MBにする

MySQLを再起動させるなら

my.ini に

max_heap_table_size=40M
と記述して、MySQLを再起動させ、alter table 文を実行する

注意事項

ここで注意すべきなのは、HEAPテーブルの上限はCREATE TABLE文もしくは、ALTER TABLE文を実行した際に決められてしまうということである。つまりmax_heap_table_sizeの値を変更したからといって、既に存在しているHEAPテーブルのサイズは変更されないのである。

まぁそれはよく考えれば当然のことで、既に満杯状態のHEAPテーブルをこの値を変更したら小さくされてしまったら良い迷惑だからね。サイズが小さくなる場合は、alter table文を実行した時に最小サイズのチェックが行われて、現状のデータより小さくなる場合はエラーとなる。