銀河鉄道~ぽんこつエンジニアのブログ~

思いつきで書いています。

MySQL MEMORYストレージエンジンとテンポラリテーブルについて

MySQLは、テーブル作成の際、いくつかのストレージエンジンから選択することができます。デフォルトはInnoDB。その他、MyISM、MEMORYなど様々な種類があります。

 

MEMORYストレージエンジンは、格納されたデータがすべてメモリ上に保持されます。InnDBやMyISMでは、データはハードディスクへ書き込まれるため、読み書きのオーバーヘッドがなく、IOが非常に高速になります。

 

ただし以下の注意点があります。

1、メモリ上にデータを保持するため、DBサーバーが落とされると格納されたデータは消える。(空のテーブルのみ残る。)

2、ロック制御がテーブルロック(MyISMと同様、InnoDBは行ロック)のため、並列処理でパフォーマンスが落ちやすい。

3、カラムはすべて固定長にへんかんされるため、一レコードのバイト数が多くなる。また、BLOB、TEXTは使用できない。

4、インデックスは「HASH」がデフォルト。InnoDBやMyISMは「BTREE」がデフォルト。どちらも使用可能。「HASH」は場合によって遅くなる可能性あり。

 

2、の解決案として、一時テーブル(Temporary Table)として使えば、クライアントごとに別々になるため並列処理が起きにくくできる。結果、パフォーマンスを保てるのではないか。

 

ただ、一時テーブルは指定の容量を超えると自動的にInnoDBに変換されるため、変換コストが発生するという話もあるが、、、

 

(以下追記)

⇒ユーザーが作成したMERORYテーブルは変換されないと公式に見つけた。

⇒CREATE TEMPORARY TEBLEで作成されたMEMORYテーブルは自動変換されない。自動変換されるのはあくまで、内部的に自動で作られる一時テーブルのみ。