2012-03-19 63 views
2

我想優化MongoDB查詢。我有一個索引from_account_id,​​和created_at。但以下查詢會執行完整的集合掃描。Mongo使用索引與排序

{ 
    "ts": { 
     "$date": "2012-03-18T20:29:27.038Z" 
    }, 
    "op": "query", 
    "ns": "heroku_app2281692.transactions", 
    "query": { 
     "$query": { 
      "$or": [ 
       { 
        "from_account_id": { 
         "$oid": "4f55968921fcaf0001000005" 
        } 
       }, 
       { 
        "to_account_id": { 
         "$oid": "4f55968921fcaf0001000005" 
        } 
       } 
      ] 
     }, 
     "$orderby": { 
      "created_at": -1 
     } 
    }, 
    "ntoreturn": 25, 
    "nscanned": 2643718, 
    "responseLength": 20, 
    "millis": 10499, 
    "client": "10.64.141.77", 
    "user": "heroku_app2281692" 
} 

如果我不這樣做的or,只有查詢from_account_id或​​與它的順序,速度非常快。

獲得理想效果的最佳方法是什麼?我應該保持account_ids(來自和來自)像一個數組一樣的領域?或者也許有更好的方法。謝謝!

回答

7

不幸的是,正如您發現的那樣,$或者子句可能會使優化器難上加難。

因此,要解決此問題,您有幾個選項。其中:

  • 將您的查詢劃分爲兩部分並手動合併結果。
  • 更改您的數據模型以允許高效查詢。例如,您可以添加一個「referenced_accounts」字段,該字段是事務中引用的所有帳戶的數組。
+0

+1,這兩個項目符合可靠的建議。 – 2012-03-19 00:58:28

+0

非常感謝您的幫助! – 2012-03-19 07:05:43

+0

$或在Mongo中不會使優化器跳過索引。它會跳過嵌套$或語句的索引: https://jira.mongodb.org/browse/SERVER-3327?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel#issue-tabs – Spencer 2012-03-19 13:52:23