DB メモ
日記を書こうと思っても書くことがないので,データベース(DB)について,メモがてら書いてみる.研究の関係で今日からデータベース(DB)をさわり始めた.とりあえず,適当に大きいデータを入れてみて検索してみた.テーブルを作るにあたってストレージエンジンを選ぶ必要がある.今までまったく DB をさわったことがなかったのでストレージエンジンの存在すら知らなかったが,MyISAM か InnoDB を使うのが普通らしい.それぞれについて調べてみたところ,研究で使うには MyISAM の方が良さそうな感じ.というか,わざわざ InnoDB にする理由が無さそう.でも一応両方作ってみてテーブルサイズと検索速度を簡単に比較してみた.テーブルに入れるデータは141 (B) × 2600000 (record) ≒ 367 MB,実験に用いるデータ 1 年分相当.データ形式は実際に用いるものと同じにして,適当な CSV ファイルを作って,そこから読み込んで入れた.まず,テーブルを作る速度が InnoDB が 3 倍ほど遅い.まあこれ自体は実際に使用する分にはさほど問題は無いが.次にデータのサイズ.上記のサイズからどれだけ大きくなっているか調べてみると,MyISAM : 379.6(MB)InnoDB : 465.567744(MB)InnoDB は MyISAM の約 1.23 倍.InnoDB は想像以上にでかかった.ちなみに 1 レコードあたりのサイズはMyISAM : 146(B)InnoDB : 179(B)そして不思議なことにレコード数がMyISAM : 2600000InnoDB : 26001131 レコードあたりのサイズが増えるのは当然だろうけど,なぜレコード数まで増える???無知な自分にはまったくわからない.最後に検索速度について.かなり簡単な似たようなクエリを 3,4 個用意してそれぞれのテーブルに対して投げ,そのとき表示される時間を見ただけの簡単な実験.結果はどのクエリでも InnoDB が MyISAM より 4 倍前後遅かった.実験 1 回分に用いるであろうデータを引っ張ってくるのにMyISAM が 1 秒弱,InnoDB が 3 秒半ばくらいだった.MyISAM でも 1 秒近くかかるのか.実際のデータは 3 年分弱くらいあるからテーブルが大きくなって速度も少し遅くなるかもしれない.それも試してみないと.ただ,このテーブルは,今回作るテーブルの中で最大と思われるサイズよりも大きめに設定してあるので,実際にはテーブルもあまり大きくならず,そんなに速度は変わらないと予想してみる.両者の比較について,この結果だけで評価を下すのは良くないけど,実際に使うときは簡単なクエリで,ある範囲のデータを参照する,というような使い方しかしないだろうから,この結果はけっこう重要そう.まあ,繰り返し実験でまったく同じクエリを何度も使う場合は,クエリキャッシュとかいうもののおかげで 2 回目以降は一瞬で終わるから,MyISAM と InnoDB に差はなくなるみたいだけど・・・ということで今回の結果から,おそらく MyISAM を使うことになりそう.InnoDB は mixi などでも使われているらしく,実際に MyISAM より多く用いられているみたい(たぶん)なので,使ってみようかと思ったんだけど,まあ仕方ないか.いつか自宅で使ってみることにしよう.