1

OR 演算子と SORT 演算子を使用する場合、Mongodb 2.2 はインデックスを使用していないように見えます。このJIRAが関係しているのだろうか。

説明させてください:

db.messages.ensureIndex({ 'to_id':1, 'sent_date':-1});
db.messages.ensureIndex({ 'from_id':1, 'sent_date':-1});

メッセージ コレクションにインデックスがあります。

 db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
    "cursor" : "BtreeCursor to_id_1_sent_date_-1",

db.messages.find( {$or: [{'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
    "cursor" : "BtreeCursor from_id_1_sent_date_-1",

クエリを実行してから、sent_date で並べ替えるには、BtreeCursor を使用します。

db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).explain()
{
    "clauses" : [
        {
            "cursor" : "BtreeCursor to_id_1",

to_id または from_id を使用したクエリでも、BtreeCursor が使用されます。

db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
    "cursor" : "BasicCursor",

不合格!to_id OR from_id AND ソートを使用したクエリは、インデックスを使用しません。なんで?

私の質問:

  • それはいつもこのようなものでしたか?
  • 人々はこれをどのように回避していますか - 人々は2つの別々のクエリを実行し、結果をコードで結び付けていますか?
4

0 に答える 0