ページ

2010年11月2日

MongoDBとmemcacheのパフォーマンス比較

単純なキー・バリューの構造でパフォーマンスがどうなのか、memcacheと比較してみました。mongodbとmemcachedはそれぞれ、ローカルの一台のちびえあたんの中で動かしています。比較するためのコードは、次のところにあります。
Javaのコードは恥ずかしいので公開しません。計測はちびえあたんでやっています。
やっていることは、MongoDBではnoとbodyというフィールドにデータを設定して、10000件登録しています。memcacheでも同様にキーにシーケンシャルな数、値にMongoDBでセットしたものと同じ値をいれてaddしています。
登録にかかる時間は、MongoDBでは1.39秒で、一件あたりにすると0.139ミリ秒です。memcacheは1.86秒で、一件あたり、0.186ミリ秒です。ほぼ誤差の範囲内のような気もしますが、若干MongoDBの方が速いです。
MongoDBはデータベースが空の状態から開始しているので、一番最初はファイルの作成などで遅くなっているので計測から外しています。

次に検索です。MongoDBでは、0から10000までと10000から0までのキーで検索しています。それぞれ、インデックスのありなしでも計測しています。その結果のグラフです。縦軸はミリ秒で、一回あたりの検索にかかった時間です。

インデックスのない状態で検索スピードが大きく違うのは、ファイルの先頭からフルスキャンして、見つかるまでやるからです。find_oneでやっていますが、findで検索するとデータ量に比例して一律遅くなると思います。
これに対してインデックスをはると、データ量にかかわらずほぼ一定の値になります。グラフがつまらないので、そのデータは載せていませんが、一件あたりの検索時間が0.4ミリ秒前後です。
memcacheの検索の時間は大体0.19ミリ秒でした。検索の時間はMongoDBでは2倍から3倍弱遅いです。この性能差をどう見るか・・・?うーん、難しいです。

次はmembaseを計測しよう!と思ってhomebrewのパッケージにはなっていなかったので、やめました。

でわでわ

1 件のコメント:

tetsuya_matsuzaki さんのコメント...

最近MongoDBを使ってみようかと調べていたのですが、速度比較の記事は参考になります。
memcachedとあまり違わないなら、十分使えます。

ちなみに、MongoDBは普通にインサートすると、自動的に"_id"にキーが作られるようです(最近気づいた)
MySQLだとauto_incrementと同じようなもののようです。
_idはインデックスが付いていて、プライマリーキーのようになっているそうです。

もしよかったら、キーを_idにセットしてKVSとしてテストしてみてください。InnoDBだとauto_incrementの処理もばかにならないので、MongoDBの場合はどのくらい影響があるのか気になります。
まぁ自分でテストすればいいんでしょうけどね(^^;