2012-03-19 2 views
2

Я пытаюсь оптимизировать запрос mongodb. У меня есть индекс на from_account_id, to_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 или to_account_id с заказом на нее, это быстро.

Каков наилучший способ получить желаемый эффект? Должен ли я хранить account_ids (оба и от) в одном поле, как массив? Или, может быть, есть лучший способ. Благодаря!

ответ

7

К сожалению, как вы обнаружили, статья $ или может затруднить жизнь оптимизатору.

Итак, чтобы обойти это, у вас есть пара вариантов. Среди них:

  • Разделите свой запрос на два и вручную объедините результаты.
  • Измените свою модель данных, чтобы обеспечить эффективный запрос. Например, вы можете добавить поле «referenced_accounts», которое является массивом всех учетных записей, на которые делается ссылка в транзакции.
+0

+1, Оба пули - солидные рекомендации. –

+0

Отлично, спасибо за помощь! –

+0

$ или в Mongo не делает индексы пропуска оптимизатора. Он пропускает индексы для вложенных $ или операторов: https://jira.mongodb.org/browse/SERVER-3327?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel#issue-tabs – Spencer

Смежные вопросы