MongoDBのパフォーマンスを向上させる方法

MongoDBのパフォーマンスを向上させる方法

MongoDB は高性能なデータベースですが、使用していくうちにパフォーマンスの問題が発生することがあります。 SQL Server、MySQL、Oracle などの他のリレーショナル データベースと比較すると、MongoDB は比較的新しいため、あまり馴染みのない人が多くいます。そのため、多くの開発者や DBA は機能の実装に重点を置き、パフォーマンス要件を無視する傾向があります。実際、SQL Server、MySQL、Oracle と同様に、MongoDB の設計調整、インデックス作成、ステートメントの最適化はパフォーマンスに大きな影響を与えます。

MongoDB のパフォーマンスを徹底的に探求するために、次の 18 項目を簡単にまとめました。 引き続きまとめ、改善を続けていくことを皆様に歓迎します。

(1)ドキュメント内の_idキーにはデフォルト値を使用することをお勧めします。_idにカスタム値を保存することは禁止されています。

解釈: すべての MongoDB ドキュメントには「_id」キーがあり、これはデフォルトで ObjectID オブジェクトです (識別子には、タイムスタンプ、マシン ID、プロセス ID、カウンターが含まれます)。 MongoDB への挿入速度は、_id を指定するか指定しないかによって大きく異なります。_id を指定すると挿入速度が低下します。

(2)短いフィールド名を使用することをお勧めします。

解釈: リレーショナル データベースとは異なり、MongoDB コレクション内の各ドキュメントにはフィールド名を保存する必要があり、長いフィールド名にはより多くのストレージ スペースが必要になります。

(3)MongoDBのインデックスはドキュメントのクエリ、更新、削除、ソート操作を改善できるため、ビジネスニーズに応じて適切にインデックスを作成します。

(4)各インデックスはある程度のスペースを占有し、挿入操作のリソース消費を引き起こします。したがって、各コレクションのインデックスの数は5以内に抑えることをお勧めします。

(5)複数のキーを含むクエリの場合、これらのキーを含む複合インデックスを作成するのが良い解決策です。複合インデックスのキー値の順序は非常に重要です。インデックスの左端プレフィックスの原則を理解してください。

解釈: たとえば、テスト コレクションに複合インデックス {a:1,b:1,c:1} を作成します。次の 7 つのクエリ ステートメントを実行します。

db.test.find({a:"hello"}) // 1
db.test.find({b:"sogo", a:"hello"}) // 2
db.test.find({a:"hello",b:"sogo",c:"666"}) // 3
db.test.find({c:"666", a:"hello"}) // 4
db.test.find({b:"sogo", c:"666"}) // 5
db.test.find({b:"sogo" }) // 6
db.test.find({c:"666"}) // 7

上記のクエリステートメントはインデックス1、2、3、4に移動する可能性がある。

クエリには、クエリ フィールドの順序に関係なく、インデックスが作成された順序で、左端のインデックス フィールドを含める必要があります。

最も少ないインデックスで、最も多くのクエリをカバーします。

(6) TTLインデックス(Time-To-Liveインデックス、ライフサイクルを持つインデックス)。TTLインデックスを使用すると、タイムアウト期間に達したドキュメントを古めかしくすることができます。ドキュメントが古めかしいレベルに達すると、削除されます。

解釈: TTL を作成するインデックスは日付型である必要があります。 TTL インデックスは単一フィールド インデックスであり、複合インデックスにすることはできません。 TTL ドキュメント削除バックグラウンド スレッドは、60 秒ごとに無効なドキュメントを削除します。固定長コレクションはサポートされていません。

(7)コレクション内のフィールドにインデックスを作成する必要があるが、コレクション内の多数のドキュメントにこのキー値が含まれていない場合は、スパースインデックスを作成することをお勧めします。

解釈: インデックスはデフォルトで密です。つまり、ドキュメントのインデックス フィールドが欠落している場合でも、インデックス内に対応する関係が存在します。スパース インデックスでは、インデックス キー値を含むドキュメントのみが表示されます。

(8)テキストインデックスを作成するときは、フィールドを1または-1ではなくテキストとして指定します。各コレクションにはテキスト インデックスが 1 つだけありますが、任意の数のフィールドにインデックスを付けることができます。

解釈: テキスト検索ははるかに高速であるため、コレクション ドキュメントの複数のフィールドに対する非効率的なクエリの代わりにテキスト インデックスを使用することをお勧めします。

(9) findOneを使用してデータベース内の複数の一致する項目を照会すると、自然にソートされたドキュメントセットの最初の項目が返されます。複数のドキュメントを返す必要がある場合は、find メソッドを使用します。

(10)クエリがドキュメント全体を返す必要がない場合、またはキー値が存在するかどうかを判断するためだけにクエリが使用される場合は、投影(マッピング)を使用して返されるフィールドを制限し、ネットワークトラフィックとクライアントのメモリ使用量を削減できます。

解釈: {key:1} を設定して返されるフィールドを明示的に指定するか、{key:0} を設定して除外するフィールドを指定できます。

(11)プレフィックススタイルのクエリを除き、正規表現クエリはインデックスを使用できず、ほとんどのセレクタよりも実行に時間がかかるため、控えめに使用する必要があります。

(12)集計演算では、$はmatchの前と$groupの前に来なければなりません。$を演算子の先頭に置くことで、一致の数と$group演算子が処理しなければならない文書の数を減らすことができます。

(13)オペレータを介して文書を変更すると、文書データを取得して変更するためにサーバーとやり取りする必要がなく、データのシリアル化と転送にかかる時間が短縮されるため、通常はパフォーマンスが向上します。

(14)バッチ挿入により、サーバーへのデータの送信回数が減り、パフォーマンスが向上します。ただし、バッチ送信の BSON サイズは 48 MB を超えません。

(15)一度に大量のデータを取得してソートすることは禁止されています。MongoDBは現在、32M以内の結果セットのソートをサポートしています。並べ替えが必要な場合は、結果セット内のデータの量を制限するようにしてください。

(16) クエリ内の一部の$演算子($ne、$、not、$exists、$nin、$orなど)はパフォーマンスを低下させる可能性があります。ビジネスではこれらの演算子を使用しないようにしてください。

a) $exist: ドキュメント構造が緩いため、クエリはすべてのドキュメントを走査する必要があります。

b) $ne: 否定された値が大多数の場合は、インデックス全体がスキャンされます。

c) $not: クエリ オプティマイザーがどのインデックスを使用するか分からなくなる可能性があり、その結果、完全なテーブル スキャンが必要になることがよくあります。

d) $nin: テーブル全体のスキャン。

e) \$ 複数の条件がある場合は、クエリが一定回数実行され、結果セットが最後にマージされます。またはに変換することを検討してください。 複数の条件がある場合は、クエリが一定回数実行され、結果セットが最後にマージされます。$in に変換することを検討してください。

(17)固定コレクションを使用してログを記録すると、データ挿入が高速化され、データ挿入時に最も古いデータを削除できるようになります。この機能は需要分析および設計時に考慮することができ、パフォーマンスが向上し、削除の必要性がなくなります。

解釈: 固定コレクションは、ドキュメントのサイズと数を指定して明示的に作成する必要があります。どちらの制限に先に達したかに関係なく、コレクションに新しいドキュメントが挿入されると、最も古いドキュメントが削除されます。

(18)コレクション内の文書のデータ量はクエリのパフォーマンスに影響します。適切な量を維持するために、定期的にアーカイブする必要があります。

Mongodb パフォーマンス最適化

データベースのパフォーマンスは、ソフトウェアの全体的なパフォーマンスに重大な影響を及ぼします。Mongodb データベースで一般的に使用されるパフォーマンス最適化方法は次のとおりです。

1. パラダイム化と脱パラダイム化

2. フィルファクターの使用

3. 索引の使用

以上がMongoDBのパフォーマンスを向上させる方法についての内容です。123WORDPRESS.COMをご愛顧いただきありがとうございました。

以下もご興味があるかもしれません:
  • MongoDB のパフォーマンスの問題を記録する (MySQL から MongoDB への移行)
  • MongoDBデータベースクエリのパフォーマンスを40倍向上させた経験
  • Mongodb のパフォーマンス最適化の問題の簡単な分析
  • MongoDB パフォーマンスの章: インデックスの作成、複合インデックス、一意のインデックス、インデックスの削除、実行プランの説明
  • MongoDB クエリ パフォーマンスの最適化の検証と検証
  • MongoDB パフォーマンスの最適化と監視

<<:  Dockerイメージをインポートおよびエクスポートする方法

>>:  必見の JavaScript 面接質問 10 選のまとめ (おすすめ)

推薦する

Linuxでkv設定ファイルを変更するにはsedコマンドを使用します

sed は Unix の文字ストリーム エディタ、つまりストリーム エディタです。行指向であり、行単...

HTMLページにビデオを挿入する方法の概要

ページでビデオ タグを使用する場合は、Ogg Theora または VP8 (これに問題がない場合)...

nginx + php の「入力ファイルが指定されていません」の解決策

本日、ローカル開発環境で突然「入力ファイルが指定されていません」というエラーが発生してしまいました。...

Linux での JDK と Tomcat のアップロードと設定に関する詳細なチュートリアル

準備1. 仮想マシンを起動する2. gitツールルートアカウントでログインルートアカウントを使用して...

HTML で入力ボックスに純粋な数字のみを入力するように制限する方法

inputボックスを純粋な数字のみに制限する1、onkeyup = "value=valu...

Intellij IDEA による Docker イメージの展開方法の手順の迅速な実装

目次1. Dockerはリモートアクセスを可能にする2. Intellij IDEAにDockerプ...

Ansibleを使用してディレクトリ内のすべてのコンテンツを削除する方法

Ansible を使用する学生は、以下に示すように、Ansible が特定のフォルダーまたはファイル...

MySQL 8.0.16 Win10 zip バージョンのインストールと設定のグラフィック チュートリアル

この記事では、MySQL 8.0.16 Win10 zip版のインストールと設定のグラフィックチュー...

HTML における DTD の使用法の概要

DTD はマークアップの文法規則のセットです。これは XML 1.0 仕様の一部であり、HTML フ...

docker ログ - docker コンテナ ログの実装を表示します

docker logs コマンドを使用してコンテナ ログを表示できます。コマンド形式: $ dock...

Windows で mysql5.7.21 をインストールするための詳細なチュートリアル

この記事では、参考までにMySQL 5.7.21のインストールチュートリアルを紹介します。具体的な内...

CSS3 でシンプルな白い雲が浮かぶ背景効果を実現

これは非常にシンプルな純粋な CSS3 の白い雲の浮遊する背景効果です。浮かぶ白い雲の特殊効果は、C...

MySQL でファイルデータをインポートする際の 1290 エラーの解決方法

エラーシナリオcmd の mysql コマンドを使用して、学生情報テーブルにデータを追加します。デー...

フロントエンドページのスライド検証を実装するための JavaScript + HTML

この記事では、フロントエンドページのスライド検証を実装するためのJavaScript + HTMLの...

ブラウザの互換モードでボタン内のテキストが垂直方向に中央揃えにならない問題について簡単に説明します。

XML/HTML コードコンテンツをクリップボードにコピー<ボタンスタイル= "カ...