MongoDBのパフォーマンスをBerkeley DB, H2, MySQLと比較
スキーマレスのドキュメント指向データベース、MongoDBがとても面白そうだったので、Javaから使用した場合のパフォーマンスを計測してみました。
MongoDBはCouchDBに似たデータベースで、任意のオブジェクトを保存できますが、MVCCやREST APIを採用しないことで高パフォーマンスを追求しているようです。インデックスやレプリケーションのサポートも充実しています。
RDBMSをKey-Value Storageとして使う場合のパフォーマンス計測(H2, MySQL編) - kaisehのブログ
前に上記のエントリーでBerkeley DB, H2, MySQLのパフォーマンスを比較したことがあるのですが、そのときと同等の条件になるようにして計測しました。
具体的な計測方法は以下の通りです。
- Mac OS 10.5.7, 2GHz Intel Core 2 Duo, 4GB Memory
- localhostでmongod 0.9.6を起動し、Java Driver 0.6で接続
- 次の形式のレコードを10000回挿入・検索し、所要時間を計測
{ key: (8バイト文字列), value: (バイト列) }
- keyにはインデックスを張る
- valueのバイト長を100, 500, 1000, 5000, 10000として計測
- 1条件につき5回計測し、中央値を採用
結果は以下のようになりました。Berkeley DB, H2, MySQLについては、比較のために以前の結果をそのまま引っ張ってきました。
DB | Record Count | Value Length | Insert (ms) | Select (ms) |
---|---|---|---|---|
MongoDB | 10,000 | 100 | 1,521 | 1,837 |
MongoDB | 10,000 | 500 | 1,586 | 1,841 |
MongoDB | 10,000 | 1,000 | 1,591 | 1,913 |
MongoDB | 10,000 | 5,000 | 1,628 | 2,032 |
MongoDB | 10,000 | 10,000 | 3,407 | 2,225 |
Berkeley | 10,000 | 100 | 135 | 53 |
Berkeley | 10,000 | 500 | 134 | 47 |
Berkeley | 10,000 | 1,000 | 205 | 48 |
Berkeley | 10,000 | 5,000 | 905 | 133 |
Berkeley | 10,000 | 10,000 | 1,819 | 267 |
H2 | 10,000 | 100 | 361 | 255 |
H2 | 10,000 | 500 | 599 | 476 |
H2 | 10,000 | 1,000 | 773 | 429 |
H2 | 10,000 | 5,000 | 16,202 | 1,873 |
H2 | 10,000 | 10,000 | 17,544 | 1,856 |
MySQL | 10,000 | 100 | 2,559 | 2,785 |
MySQL | 10,000 | 500 | 2,929 | 2,830 |
MySQL | 10,000 | 1,000 | 3,805 | 2,873 |
MySQL | 10,000 | 5,000 | 7,799 | 3,044 |
MySQL | 10,000 | 10,000 | 19,020 | 3,244 |
1レコードあたりの所要時間をグラフ化したものが以下です(バーが短いほど高速)。
この計測条件下では、MongoDBは
- Berkeley DBよりもかなり遅い
- H2(Embedded)より速いこともある
- MySQLよりもかなり速い
- レコード長によるパフォーマンス影響を受けにくい
ことが分かりました。想像していたより速度が出なかったですが、Client-Server間のオーバーヘッドがあるので仕方ない気もします。