mongoDBを使う時気を付けていること
前回の記事「RDB とは一味違う!? MongoDB の特徴」で mongoDB の有用性について触れさせていただいたのですが、
今回 mongoDB を使っていて不便に感じた箇所を挙げていきます。
node.js のドライバーを用いてですので、一部 node.js の愚痴みたいになってしまっていますがご了承下さい…。
トランザクションが弱い
mongoDB は速度が早く、スケールしやすいメリットがあります。
何とのトレードオフでこのメリットが実現しているのか、
まずはトランザクションと言えます。
mongoDB はトランザクションをサポートしていないのです。
簡単に言うと 1つのドキュメント(レコード)に対しての update だけが動作を保証されています。
一般的な RDB のように一つのクエリーで複数のドキュメントを更新しようとして、
途中で失敗すると先に実行されたドキュメントは更新されますが、中断されたドキュメントは変更されず整合性が取れなくなります。
例えばサイト内ポイントを使ってサービスの閲覧権限を購入するといった処理を行う際、途中で処理に失敗が生じると
ポイントだけ消費されて、サービスの閲覧権限は付与されないといった不具合が生じます。
回避の方法もあるようですが、プログラム側で実装しようとするとどうしても複雑なコードの実装が必要となってしまします。
スキーマレス
mongoDBのメリットでもあるのですが、スキーマがないということはどんなデータが入っているかわからない。
あるのかないのかすらわからないです。
配列が入っているのか、オブジェクトが入っているのか、それすら不明なのでいざデータを使用する時予期せぬデータが入っていてエラーとなることがよくあります。
特にデータが json 形式なので node.js と非常に相性がいいのですが、node.js 自体は型という概念がほとんどないのでエラーが出てそれを予想できていないとウェブサーバー自体が落ちてしまうことがあります。
正規表現による find
データの検索の時正規表現によって曖昧検索を掛けることができますが、
曖昧検索だとインデックスが効かないので 1GB 程度のコレクションから正規表現で検索を掛けた時、
node.js の mongoDB クライアントから返答があるまで5秒近くかかっていました。
CLI で検索した時 0.1秒 程で応答があったので、これはどちらかというと mongoDB が遅いのでなく node.js のドライバーが原因のようでした。
その他の制約等
その他細かいですが、mongoDB を使う上で気を付けている事として、
サイズ的な制約でドキュメント1つ辺りのサイズが 16MB までと制約があります。
json 形式ですのでいくらでもデータを入れることができるのですが、この制約の内での話しです。
インデックスを作りすぎると insert が遅くなる。
またインデックスとコレクションがメモリに収まり切らないとダメなので必然コレクションの上限サイズも決まってきます。
特に顕著なのが、32bitOS だと使えるメモリ量に大幅な制限が掛かるので 2.5GB 程度しか使えないです。
ただ最近は 32bitOS の方が珍しいのであまり問題ではないですが・・・
そして何より write 時にロックがかかってしまう問題があります。
mongoDB2 系以前だとグローバルでロックがかかり DB 自体が動作しなくなったそうです。
現在はコレクション単位でのロックなので、大量のデータを書き込まない限りこの問題は発生しないのですが、
node.js でparallel 等で一気に数百のデータを書き込もうとすると結構応答がなくなります。
必要以上に連続で大きなクエリは投げないようにしています。
まとめ
速度面で RDB に比べ優れているはずの mongoDB ですが、用法を誤るとアプリケーション自体の速度が優れずチューニングに気を使うハメになったりします。
mongoDB を使う上で最低限本記事であげた部分には気を使って実装を進めているのですが、
ビッグデータと呼ばれる程のデータを取り扱う時 RDB とはまた違った注意をする必要があります。
-
お問い合わせ
SiTest の導入検討や
他社ツールとの違い・比較について
弊社のプロフェッショナルが
喜んでサポートいたします。 -
コンサルティング
ヒートマップの活用、ABテストの実施や
フォームの改善でお困りの方は、
弊社のプロフェッショナルが
コンサルティングいたします。
今すぐお気軽にご相談ください。
今すぐお気軽に
ご相談ください。
(平日 10:00~19:00)
今すぐお気軽に
ご相談ください。
0120-315-465
(平日 10:00~19:00)
グラッドキューブは
「ISMS認証」を取得しています。
認証範囲:
インターネットマーケティング支援事業、インターネットASPサービスの提供、コンテンツメディア事業
「ISMS認証」とは、財団法人・日本情報処理開発協会が定めた企業の情報情報セキュリティマネジメントシステムの評価制度です。