はじめに
これまで数回にわたって,代表的なNoSQLデータベースを取り上げ,利用シーンや具体的なコード例について紹介してきました。連載の最後となる今回は,それぞれのNoSQLデータベースのパフォーマンスについて比較してみたいと思います。
それぞれのデータベースの特徴
まず,これまで紹介してきたNoSQLデータベースやRDBMSの特徴を簡単にまとめてみます。それぞれに以下のような特徴がありました。
表1 それぞれのデータベースの特徴
| データベース | タイプ | 特徴 |
|---|---|---|
| MySQL, PostgreSQL | RDBMS | データの一貫性,JOIN,トランザクション |
| memcached | 揮発性KVS | 非常に高速,シンプルで扱いやすい |
| TokyoTyrant | 永続性KVS | memcachedの代替,テーブルデータベース |
| MongoDB | ドキュメント指向型DB | スキーマレス,柔軟な検索が可能 |
| HBase, Cassandra | 列指向DB | 列指向,大規模データに強み |
この表では言及していませんが,Consistent Hashingやshardingによって分散させやすいというのはすべてのNoSQLデータベースが備えている特徴でしたね。
検証用サーバの準備
では実際のパフォーマンスを比較してみましょう。比較のため,10,000件のデータの書込み/読込みを行います。実行にあたり各種サーバを起動します。
リスト1 検証用サーバの起動コマンド
# memcached
memcached -u nobody -d
# TokyoTyrant
sudo ttserver -pid /var/ttserver/pid -dmn /var/ttserver/bench.tch
# MongoDB
mongod --dbpath ~/tmp/mongodb &
# HBase
sudo /etc/init.d/hadoop-0.20-namenode start
sudo /etc/init.d/hadoop-0.20-jobtracker start
sudo /etc/init.d/hadoop-0.20-datanode start
sudo /etc/init.d/hadoop-0.20-tasktracker start
sudo /etc/init.d/hadoop-hbase-master star
hbase org.apache.hadoop.hbase.rest.Main &
データ書込み時のパフォーマンス
最初に書込みのパフォーマンスを比較してみます(※1)。ベンチマークに使ったスクリプトはこちらに置いてあります。
- ※1
- 今回はデータ数も少ないのでインデックスは張っていない状態で比較しています。
ベンチマークスクリプトを見ればわかりますが,これは非常にシンプルなデータの書込みを行った結果です。 もちろん,正確に検証するためには実際のユースケースに近づけたり設定を最適化したりする必要があると思いますが,参考になるのではないでしょうか。
結果を見るかぎり,やはりmemcachedとTokyoTyrantは高速ですね。MongoDBもMySQLと比べると高速です。HBaseはMySQL(InnoDB)と同程度でしょうか。HBaseなどは大量データの書込みに強いので,大規模なデータで試すと結果は変わってくるかもしれません。
| データベース | user | system | total | real |
|---|---|---|---|---|
| InnoDB | 5.520000 | 0.240000 | 5.760000 | 12.129957 |
| InnoDB | 3.160000 | 0.090000 | 3.250000 | 23.457241 |
| memcached | 0.590000 | 0.140000 | 0.730000 | 1.521368 |
| TokyoTyrant | 0.610000 | 0.080000 | 0.690000 | 1.630604 |
| MongoDB | 3.400000 | 0.060000 | 3.460000 | 7.619440 |
| HBase | 6.440000 | 0.560000 | 7.000000 | 23.114616 |
データ読込み時のパフォーマンス
次に,データの読込みについてもパフォーマンスを計測してみました。RDBMSとMongoDBの場合は属性の値で,memcached, TokyoTyrant, HBaseの場合にはkeyでデータを検索した場合です。
結果を見ると,やはりmemcachedとTokyoTyrantは圧倒的に高速です。HBaseはそれほど早くは無いようですね。MongoDBもMySQL(InnoDB)と比べると早いかな,といった程度です(※2)。
| タイプ | user | system | total | real |
|---|---|---|---|---|
| MyISAM | 1.110000 | 0.050000 | 1.160000 | 20.795722 |
| InnoDB | 1.290000 | 0.060000 | 1.350000 | 43.346054 |
| memcached | 0.000000 | 0.000000 | 0.000000 | 0.025663 |
| TokyoTyrant | 0.000000 | 0.000000 | 0.000000 | 0.067683 |
| MongoDB | 5.060000 | 0.150000 | 5.210000 | 27.627721 |
| HBase | 8.570000 | 0.880000 | 9.450000 | 28.567611 |
- ※2
- これはあくまでも単純なデータの読込みを行った場合の結果です。例えばMongoDBの場合,JOINの影響を考慮するとMySQLよりも非常に早くなるという結果が得られました。
まとめ
これまで扱ってきたNoSQLデータベースやRDBMSを,パフォーマンスの観点から比較してみました。あくまでも単純なデータの書込み/読込みを比較しただけですが,どのNoSQLデータベースがどの程度のパフォーマンスを出すのか,ある程度わかったのではないでしょうか。
高速なデータのやりとり,一貫性の保証,可用性,スキーマレス,大規模データの取り扱い,分散のさせやすさ…NoSQLデータベースにはタイプ毎に様々な強みがあり,うまく利用すれば非常に強力なツールであることは間違いありません。しかし,一方で運用コストの増加やNoSQLデータベースを選択したことによるコード修正(※3)などのデメリットもあります。
今後もNoSQLデータベースは注目されていくと思いますが,採用することで得られるメリットとデメリットを天秤にかけて(もちろんパフォーマンスだけではなく,扱いやすさなども),適材適所で利用していくのが良いでしょう。
- ※3
- 例えば,従来のRDBMSであればJOINで一発だった処理を,2つの処理にわけたり。

