find和sort同时使用时,mongodb是如何处理的?
大家讲道理
大家讲道理 2017-05-02 09:20:21
0
1
593

今天在mongodb索引帮助文档里发现下边的描述:
集合order有以下索引:

{ qty: 1 }
{ status: 1, ord_date: -1 }
{ status: 1 }
{ ord_date: -1 }

查询语句:

db.orders.find( { qty: { $gt: 10 } } ).sort( { status: 1 } )

That is, MongoDB does not use the { qty: 1 } index for the query, and the separate { status: 1 } or the { status: 1, ord_date: -1 } index for the sort.

sort不能使用{ status: 1 } 或 { status: 1, ord_date: -1 } 我能理解,但是为什么find不能使用{ qty: 1 } 这个索引呢?

补充:是我理解错了,查询最后使用了{qty:1}这个索引

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全員に返信(1)
PHPzhong

まず質問させてください。このクエリにどのインデックスが使用されているか試したことがありますか?
その段落についてもう一度英語で話しましょう。あなたはその意味を誤解しているかもしれません。この文の意味: クエリ エンジンは、findを満たすために {qty:1}同時に使用し、その後 { sort を満たすには、status : 1} または {status: 1, ord_date: -1} を使用します。もっと明確に言うと、クエリは find を満たすために {qty: 1} を使用するか (その後メモリ ソートを使用する)、または {status: を使用する必要があります。 1} または {status: 1, ord_date: -1} は並べ替えを満たします (ただし、結果セットはセット スキャンを通じてのみ見つかります)。 {qty:1}去满足find同时再使用{status: 1}{status: 1, ord_date: -1}去满足sort。我换个明白点的说法:查询要么使用{qty: 1}去满足find(然后使用内存排序),要么使用{status: 1}{status: 1, ord_date: -1}满足排序(但是只能通过集合扫描查找结果集)。
你现有的索引中没有能够同时满足查询和排序的索引,能够达到这个目的的是:{status: 1, qty: 1}。但问题是这也并不见得就是一个好的选择。说不定{qty: 1}+内存排序会更高效。这完全取决于你的数据分布情况。具体原理其实跟RDBMS中的索引是一个道理,或者说使用B/B+树的索引都这德性。几句话说不清楚还是查阅一下相关资料吧。
简单的办法是把刚才提到的索引都建好,然后运行一下这个查询,让它们自己去撕吧,最终查询引擎会基于采样数据为你选出一个最好的索引。
所以回到最初的问题,你有没有去试一下到底选择了哪个索引呢?因为最终哪个索引撕赢了是基于你数据的分布情况确定的,这里没法给出确定的答案。我愿意赌{status: 1, qty: 1}クエリと並べ替えの両方を満たすことができるインデックスは既存のインデックスにありません。{status: 1, qty: 1} です。しかし問題は、これが必ずしも良い選択ではないということです。おそらく {qty: 1} + メモリの並べ替えの方が効率的になるでしょう。それはすべてデータの配布に依存します。具体的な原理は実はRDBMSのインデックスと同じで、B/B+ツリーを使ったインデックスはこの利点を持っています。いくつかの言葉で明確に説明できない場合は、関連情報を調べてみましょう。

簡単な方法は、今述べたすべてのインデックスを構築してから、このクエリを実行し、最後にクエリ エンジンがサンプリングされたデータに基づいて最適なインデックスを選択することです。 #🎜🎜#それでは元の質問に戻りますが、どのインデックスを選択するか試してみましたか?最終的にどのインデックスが勝つかはデータの分布に基づいて決定されるため、ここでは明確な答えはありません。 {status: 1, qty: 1} が勝つことに賭けたいと思います。 #🎜🎜#
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート