NoSQLデータベースを試してみる

第6回 パフォーマンスはどうなの?

この記事を読むのに必要な時間:およそ 2 分

はじめに

これまで数回にわたって,代表的なNoSQLデータベースを取り上げ,利用シーンや具体的なコード例について紹介してきました。連載の最後となる今回は,それぞれのNoSQLデータベースのパフォーマンスについて比較してみたいと思います。

それぞれのデータベースの特徴

まず,これまで紹介してきたNoSQLデータベースやRDBMSの特徴を簡単にまとめてみます。それぞれに以下のような特徴がありました。

表1 それぞれのデータベースの特徴

データベースタイプ特徴
MySQL, PostgreSQLRDBMSデータの一貫性,JOIN,トランザクション
memcached揮発性KVS非常に高速,シンプルで扱いやすい
TokyoTyrant永続性KVSmemcachedの代替,テーブルデータベース
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などは大量データの書込みに強いので,大規模なデータで試すと結果は変わってくるかもしれません。

データベースusersystemtotalreal
InnoDB5.5200000.2400005.76000012.129957
InnoDB3.1600000.0900003.25000023.457241
memcached0.5900000.1400000.7300001.521368
TokyoTyrant0.6100000.0800000.6900001.630604
MongoDB3.4000000.0600003.4600007.619440
HBase6.4400000.5600007.00000023.114616

データ読込み時のパフォーマンス

次に,データの読込みについてもパフォーマンスを計測してみました。RDBMSとMongoDBの場合は属性の値で,memcached, TokyoTyrant, HBaseの場合にはkeyでデータを検索した場合です。

結果を見ると,やはりmemcachedとTokyoTyrantは圧倒的に高速です。HBaseはそれほど早くは無いようですね。MongoDBもMySQL(InnoDB)と比べると早いかな,といった程度です※2)。

タイプusersystemtotalreal
MyISAM1.1100000.0500001.16000020.795722
InnoDB1.2900000.0600001.35000043.346054
memcached0.0000000.0000000.0000000.025663
TokyoTyrant0.0000000.0000000.0000000.067683
MongoDB5.0600000.1500005.21000027.627721
HBase8.5700000.8800009.45000028.567611
※2
これはあくまでも単純なデータの読込みを行った場合の結果です。例えばMongoDBの場合,JOINの影響を考慮するとMySQLよりも非常に早くなるという結果が得られました

まとめ

これまで扱ってきたNoSQLデータベースやRDBMSを,パフォーマンスの観点から比較してみました。あくまでも単純なデータの書込み/読込みを比較しただけですが,どのNoSQLデータベースがどの程度のパフォーマンスを出すのか,ある程度わかったのではないでしょうか。

高速なデータのやりとり,一貫性の保証,可用性,スキーマレス,大規模データの取り扱い,分散のさせやすさ…NoSQLデータベースにはタイプ毎に様々な強みがあり,うまく利用すれば非常に強力なツールであることは間違いありません。しかし,一方で運用コストの増加やNoSQLデータベースを選択したことによるコード修正※3などのデメリットもあります。

今後もNoSQLデータベースは注目されていくと思いますが,採用することで得られるメリットとデメリットを天秤にかけて(もちろんパフォーマンスだけではなく,扱いやすさなども),適材適所で利用していくのが良いでしょう。

※3
例えば,従来のRDBMSであればJOINで一発だった処理を,2つの処理にわけたり。

著者プロフィール

佐々木達也(ささきたつや)

普段は主にHadoopを用いた大規模データ解析を行っている象使いエンジニア。最近はNoSQLデータベースにも興味を持っている。Ruby, Railsはもちろん、広島カープも大好き。

bloghttp://blog.livedoor.jp/sasata299/

twitterhttp://twitter.com/sasata299/

コメント

  • Principal

    一点お伺いしたいのですが、この記事のベンチマークで 表の結果の単位は、恐らく時間の単位だと思うのですが、具体的にどうなってましたでしょうか?

    10000件のデータ読み込みということで、オーダーとしてはミリ秒か、マイクロ秒位かと思うのですが。

    ご確認させて頂けましたら幸いです。

    Commented : #2  Hadoop Impala (2014/07/24, 11:40)

  • Re:

    HBaseに関して、stargateは殆どメンテナンスされたないし、オーバーヘッドが結構大きいです。 時間があればJavaで同じテストすると結果が大きく変わると思われます。

    また、HBaseの一つの特徴としてもソートされてる情報であるのでスキャナーでのシケンシャルアクセスがとても早いけど、シングルリードには期待しないほうがいいでしょう。

    Commented : #1  connolly juhani (2010/08/02, 17:17)

コメントの記入