読者です 読者をやめる 読者になる 読者になる

NoSQLデータベースガイドを読みました。著者: @sasata299

NoSQL DB Book

NoSQLデータベースファーストガイド

NoSQLデータベースファーストガイド

NoSQLデータベースガイドを読み終わりました。
@sasata299さんが著者のNoSQL入門本。
入門本にしては、割と内容が濃くて面白かった。
学んだことは下記の点。

  • NoSQLは多種多様、
  • SQLに比べて複雑なことはできない、でも高性能
  • 簡単に分散並列処理してスケールアウトに対応できるようにしている

■多様性について。
RDBではSQLの規格が統一されているので、割と同じようなものが多いが、NoSQLはまだ出たばかり。
すべてmemoryに蓄積する揮発性NoSQLのmemcached。
ディスクIOをC言語で高速化することで不揮発性を保つTokyoTyrant
基本メモリ側に蓄積するが、非同期でディスク側にスナップショットを取り、アトミックな処理にも強いRedis。
スキーマレスで柔軟なデータベースが構築できるMongoDB。
どれも一長一短。適切なところで使わないと長所を活かせない。

SQLに比べて複雑なことはできない、でも高性能
RDBの基本方針は正規化。実際の開発では考慮しない時もあるが、
基本的にデータは正規化して、重複や更新時異常を避けるという考え方に則っている。
そうすると実際に利用するときにJOINすることが避けられないが、NoSQLではJOINができないものが
ほとんど。
ただし、非常に高性能。本に書いてあった数値のReal時間をまとめてみたので、この表を見て欲しい。










DB/Time(sec)insertselectselect(with index)
InnoDB(MySQL)47.54120.219.03
MyISAM(MySQL)27.7973.4813.36
memcached3.198.438.56
TokyoTyrant(memcached互換プロトコル)3.377.507.47
TokyoTyrant(originalプロトコル)1.361.631.82
Redis2.212.322.13
MongoDB11.35109.8816.69

これは20000件の挿入(insert処理)、検索(select処理)、インデックス付き検索(select with index)を各DBに対して実行した時間(秒)になります。
どのNoSQLも単純な挿入と検索ではMySQLよりも早いという結果が出ています。
特にTokyoTyrantとRedisの2つは高速。性能を不等号で表すと以下のような感じですかね。

TokyoTyrant(original) ≒ Redis > TokyoTyrant(mem) ≒ memcached > MongoDB > MySQL

■分散並列処理
最後にどのNoSQLも分散化する機能を備えているため、スケールアウトに簡単に対応できるようになっています。
レプリケーションやシャーディングの方法もこの本で紹介されています。
オンメモリ処理が基本のNoSQLですが、レプリケーションによって障害耐性も考慮することができるようになります。
クラウドの今のところのメインストリームは安いマシンを複数台並列に処理させることなので、
分散並列処理が簡単にできるというのはクラウドのアーキテクチャを考える上で非常に有用です。

※OracleではOracle Exadataなどの超高速マシンを導入することで1台で大規模処理を実現しようとしていますが、
中小企業が購入できるような値段ではないので、一般に支持されるようになるのはまだ先な気がします。

■まとめと感想
memcached以外のNoSQLは導入する事例が少なく、まだ導入を検討している段階の企業も多いと思いますが、
本書を読めば、問題点や利点が明らかになります。NoSQLを考慮する上で今の一番の障壁はその導入事例の薄さだと思いますが、
ここまで高速だと、これからはどんどん増えてくると思われます。

Key-Value-Store形式のNoSQLとドキュメント志向のNoSQLの紹介はあったのですが、欲を言えば、Cassandraを代表とする
カラム志向のDBについても深く紹介してもらいたかったかと思います。第一章での紹介はあるのですが、性能差を検証してもらいたかったかと。
特に列志向が得意とするCountやSUMのような処理はどこまで高速化されるのか知りたかったですね。

自分はMongoDB以外のNoSQLは利用したことがないので、色んなものにチャレンジしたいと思います、特に
TokyoTyrant、Redisは使ってみたいと思いました。
自分が今利用しているPaaSのherokuではTokyoTyrantはサポートしていませんし、Redisのサポートも無料版では
永続化までサポートされないので、試すならローカルでやるか他のPaaSをあたってみようかと思います。

NoSQL stands for Not Only SQL. It is not "No SQL",
We should use both SQL and NoSQL.