Монго с использованием индексов с сортировкой - PullRequest
2 голосов
/ 19 марта 2012

Я пытаюсь оптимизировать запрос mongodb. У меня есть индекс на from_account_id, to_account_id и created_at. Но следующий запрос выполняет полное сканирование коллекции.

{
    "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 (как от и до) в одном поле, как массив? Или, возможно, есть лучший способ. Спасибо!

1 Ответ

7 голосов
/ 19 марта 2012

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

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

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