問題タブ [query-planner]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mongodb - MongoDB 最適インデックス | クエリ プランナーの動作
2 億 5000 万以上のドキュメントをホストする MongoDB シャード クラスターがあります。
ドキュメントの構造は次のとおりです。
したがって、基本的に一部のドキュメントにはフィールドuninstalledがあり、一部のドキュメントにはありません。
以下は、コレクションに対するクエリです (これは pymongo の説明です。datetime.datetime s については申し訳ありません)。
コレクションにある 2 つの関連するインデックスを次に示します。
問題は、MongoDb クエリ プランナーが、まったく同じ目的 でコレクションにあるIndex1を選択しないように見えることです。
私の最初の印象は、クエリは、インデックスを構造化した方法でカバーされたインデックスを使用するというものでした [したがって、非常に高速です]。 150 万のドキュメントの結果セットの場合は 6 分 [つまり、一致する app_id には約 150 万のドキュメントがあります]。
「Index1」を使用して拒否された計画を示すクエリの Explain の出力を次に示します。
以下は、無関係でカバーされていない Index2を使用した勝者の計画です。
- mongodb がインデックスを正しく使用しない理由について何か考えはありますか?
- アンインストール済みが一部のドキュメントに存在しない可能性があるためですか?
- 複合日付クエリを実行するときのインデックスの方向に関するいくつかの説明も大歓迎です。おそらくその理由はインデックスの方向ですか?
(1, -1, -1, 1)
ありがとう!:)
------------編集--------------
説明の完全な結果は少し長いので、ここに貼り付けました。これは、queryPlanner のインデックス (Index2) の選択を説明しています。
また、shard_key については、ここでクエリされているものとはまったく異なります。そのため、このクエリ専用の別の特定のインデックスを定義しています。(シャード キーは、(app_id、android_id、some_other_field_not_in_query) の複合インデックスです。
sql - PostgreSQL がブール WHERE 条件でソートするのはなぜですか?
一連の具体化されたビューに対していくつかのクエリをテストしています。それらはすべて、次のように同じ構造を持っています。
明らかに、システムはそれらのそれぞれに対して異なるクエリプランを提供していますが、(例のように) WHERE 句にブール列が含まれている場合 (およびその場合にのみ)、プランナーは終了する前に常に結果セットを並べ替えます。例:
私はこの種のアプローチについて非常に興味がありますが、これについての説明はまだ見つかっていません。