はじめに
これまで数回にわたって、代表的な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と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 |
まとめ
これまで扱ってきたNoSQLデータベースやRDBMSを、パフォーマンスの観点から比較してみました。あくまでも単純なデータの書込み/読込みを比較しただけですが、どのNoSQLデータベースがどの程度のパフォーマンスを出すのか、ある程度わかったのではないでしょうか。
高速なデータのやりとり、一貫性の保証、可用性、スキーマレス、大規模データの取り扱い、分散のさせやすさ…NoSQLデータベースにはタイプ毎に様々な強みがあり、うまく利用すれば非常に強力なツールであることは間違いありません。しかし、一方で運用コストの増加やNoSQLデータベースを選択したことによるコード修正[3]などのデメリットもあります。
今後もNoSQLデータベースは注目されていくと思いますが、採用することで得られるメリットとデメリットを天秤にかけて(もちろんパフォーマンスだけではなく、扱いやすさなども)、適材適所で利用していくのが良いでしょう。