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 選のまとめ (おすすめ)

推薦する

MySQL での and or クエリの優先度分析

これは見落とされがちな問題かもしれません。まず、次の点を明確にする必要があります。 MySQL では...

JavaScript オブジェクト指向の実践の詳細説明: カプセル化とオブジェクトのドラッグ

目次概要1. DOM要素をアニメーション化する方法2. 現在のブラウザでサポートされている変換互換の...

CSS の子要素を親要素と高い一貫性を持たせる方法

絶対位置決め方式: (1)親要素を相対配置に設定します。親要素の高さを指定しない場合は、左の子要素の...

データベースのデフォルトパスを変更した後にmysqlが起動できない問題の解決策

序文mysql がデフォルトのデータベース パスを変更したため、サービスを開始できませんでした。ログ...

Linux teeコマンドの使い方の詳しい説明

teeコマンドは主にstandout(標準出力ストリーム、通常はコマンド実行ウィンドウ)に出力し、同...

MySQL 空間データストレージと関数

目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...

Linux で nginx を起動および再起動する方法

Nginx (エンジン x) は、IMAP/POP3/SMTP サービスも提供する高性能 HTTP ...

HTML の空リンク href="#" と href="javascript:void(0)" の違い

# には位置情報が含まれます。デフォルトのアンカーは #top で、これは Web ページの上部です...

nginx での書き換えジャンプの実装

1. 新旧ドメイン名のジャンプ適用シナリオ: ドメイン名ベースのリダイレクト。会社の古いドメイン名は...

iframe を介してフレームセットを本体に配置する

フレームセットと本文は同じレベルにあるため、本文にフレームセットを配置することはできません。まずペー...

ページにデータを表示するReactメソッド

目次親コンポーネントリストボックスリストコンポーネントボタンコンポーネント PageButton昨年...

Excel エクスポートは docker 環境では常に失敗する

Excel のエクスポートは、docker 環境では常に失敗します。最も直接的な原因は、中国語フォン...

Vue3 の emitting と attr の違いの分析

目次結論は実践分析拡張機能要約する結論は親コンポーネントでカスタム イベントが定義されている場合、子...

UbuntuでGRUBの起動時間を変更する

grubの起動時間を変更するためのオンライン検索は基本的に/etc/default/grubを変更す...

フロントエンド制作に関する簡単な議論: 互換性のために IE6 はまだ必要ですか?

国内市場ではIE6~7のサポートに対する一定の需要がまだありますが、フロントエンド開発者として、私た...