MongoDB活用ヒント集 第2回:パフォーマンス最適化と安全な運用のためのテクニック
本記事は、Tricoreが2017年8月24日に公開した記事をもとに再編集したものです。
シリーズ第1回ではMongoDBの基本的な活用のコツをご紹介しました。第2回となる今回は、最適化、パフォーマンス、速度、インデックス、スキーマ設計、そしてデータの安全性など、より実践的なトピックを取り上げます。
ヒント1: 開発環境では--notablescanオプションを活用する(本番環境では使わない)
出典: www.percona.com
MongoDBには--notablescanというオプションがあり、これを有効にすると、フルテーブルスキャン(全コレクション走査)が必要になるクエリに対してエラーを返すようになります。
このオプションは開発環境で非常に便利です。すべてのクエリがインデックスを適切に利用しているかどうかを確認でき、インデックス設計の漏れを早期に発見できます。
ただし、本番環境での使用は推奨されません。多くのシンプルな管理タスクではテーブルスキャンが発生するため、パフォーマンス問題を引き起こす可能性があるからです。また、このオプションを使うことで、データベース内のどのコレクションがフルテーブルスキャンを必要としているかの一覧を把握することもできます。
ヒント2: 単一のシェルですべてのサーバーとデータベースを管理する
デフォルト設定では、MongoDBはlocalhost:27017に接続します。mongo host:port/databaseのようにコマンドを実行すれば、起動時に任意のサーバーへ接続することも可能です。
さらに、同じシェルの中で複数のサーバーやデータベースに接続することもできます。
例えば、あるアプリケーションが「販売店(ディーラー)用データベース」と「販売代理店(ディストリビューター)用データベース」の両方を使用しているケースを考えてみましょう。MongoDBなら、同一のシェル内で2つのデータベースを行き来しながら操作できるため、作業効率が大きく向上します。
ヒント3: JavaScriptを習得する
MongoDBのシェルはJavaScriptで動作しています。そのため、MongoDBを最大限に活用したいなら、JavaScript®への理解は欠かせません。
JavaScriptはMongoDBユーザーの間で広く使われている言語であり、情報へ最も素早くアクセスできる手段だからです。柔軟性とパワーを兼ね備えた優れた機能を持つJavaScriptを習得することで、シェルから得られる価値を最大化できます。
ヒント4: サーバーの特定時点バックアップを取得する
ジャーナリングが有効になっているデータベースのバックアップを取得するには、ファイルシステムのスナップショットを利用するか、通常のfsync+lockを実行してからダンプを取る方法があります。
注意点として、fsyncとロックを行わずにファイルを単純コピーしてはいけません。コピー処理は瞬時に行われるものではなく、時間差が生じるためです。特に、ジャーナルファイルのコピー先とバックアップが異なるボリューム上にある場合、後になってバックアップが無効になってしまう恐れがあります。
ヒント5: データは1つのクエリで取得できるよう設計する
「アプリケーションユニット」という言葉は、一部のアプリケーションの作業形態を表すために使われます。アプリケーションユニットとは、アプリケーションが実行する個別の作業単位のことで、データベースへのアクセスを伴う場合があります。
MongoDBのスキーマを設計する際は、「1つのアプリケーションユニットにつき1クエリ」を目標にするとよいでしょう。
Webアプリケーションやモバイルアプリケーションの場合、アプリケーションユニットはバックエンドへの1リクエストと考えることができます。
その他の例も挙げてみます。
- デスクトップアプリケーションの場合: アプリケーションユニットは、ユーザーとクライアントの1回のやり取りに相当します。
- 分析システムの場合: アプリケーションユニットは、ダッシュボードの1回の読み込みに相当します。
まとめ
MongoDBは高速で堅牢、かつ高い拡張性を備えたデータベースです。多数のプラットフォームで動作し、さまざまな言語向けドライバーが提供されているため、幅広い環境で最適なパフォーマンスを発揮します。
現在もMongoDBの人気は日々高まっています。MongoDBの基礎と効果的な使い方を理解しておくことは、あらゆる開発者にとって大きな武器となるでしょう。
MongoDBの学習を始めたばかりの方も、ぜひ実際の開発でこれらのヒントを試してみてください。
-
MongoDBにおけるコードインジェクション(NoSQLi)の脅威と対策を徹底解説
初出:2019年3月5日 アプリケーション開発者、データベース管理者(DBA)、あるいはあらゆる分野の技術者にとって、コードインジェクションは常に意識しておくべき脅威です。 クラウド環境は堅牢に保ち、データベースへのアクセスも厳しく制限している――しかし、アプリケーションのコードはどうでしょうか。「NoSQLはSQLより安全」と考えられがちですが、NoSQLi(NoSQLインジェクション)のNoは「インジェクション不可能」という意味ではありません。NoSQLも他のデータベースと同様に、コードインジェクションに対して脆弱になり得ます。コードインジェクションへの備えを怠るのは、玄関にセキュリティ
-
MongoDBで未使用のインデックスを検索する方法 ― $indexStats活用の6つのポイント
MongoDBはバージョン3.2以降、すべてのインデックスに対して使用状況の統計情報を追跡しています。これらの統計へアクセスするために、MongoDBは$indexStatsアグリゲーションパイプラインステージを提供しています。この記事では、MongoDBで未使用のインデックスを特定する際に押さえておきたい6つのポイントを解説します。例えば、次のコマンドを実行すると、コレクション「test.foo」のインデックス統計を取得できます。db.foo.aggregate( [ { $indexStats: { } } ] )参考: $indexStatsに関する公式ドキュメント$indexStats