The table ‘tmp’ is full

MySQLでMEMORYなテーブルをつくってずこずこインサートしてたら怒られた。

MySQL 1114 the table tmp is full

DROP TABLE IF EXISTS `search`.`yousan_tmp`;
CREATE TABLE  `search`.`yousan_tmp` (
`ID` int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY  (`ID`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;

insert into yousan_tmp select ID from wordpress.wp_posts;

どうやらテーブルの領域を食い尽くしたらしい。

とはいってもInnoDBみたいにHDDに書く訳じゃないから最悪swapでもして適当になんとかしてくれ、って思っちゃうね。というのもMEMORYなテーブルの要領ってどの変数によって決められるかを知らないから。

IDがintの10だから、対象レコードを200万件、3Mレコードと見積もって、

3M rec * 10Byte = 30MB

よゆうじゃんね。調べたらこんなのが。

複雑なJOINやGROUP BYの処理などは、テンポラリテーブルを用いて行われる。テンポラリテーブルはまずMEMORYストレージエンジンとして作成されるが、–tmp-table-sizeバイトまたは–max-heap-table-sizeバイトを超えるとMyISAMに変換される。もちろん、MyISAMはディスクアクセスを発生させるため処理はスローダウンしてしまう。それを避けるためには、それらの値を大きくすると良い。どの程度まで大きく出来るかは実際に搭載されているメモリ量と相談である。

メモリ上に作成されるテンポラリテーブル

なるほど。

show variables;

‘max_heap_table_size’, ‘16777216’

16,777,216なので、16M。単位は不明。

SHOW TABLE STATUS like ‘yousan_tmp’;

Data_Length = 9408656

MySQL Administrator ToolによるとこちらはByteらしい。だからさっきのもおそらくByte。

ということは9MBしかできてない。うーんなんでだ。よくわかんないけど値を変えてやる。

set global max_heap_table_size = 64*1024*1024;

なんか結局設定できなくて、my.cnfに書いて再起動。

あと最後に見かけた参考リンク
MEMORYテーブルが大きくなり過ぎないように…

コメントを残す