Монго составные индексы, использующие меньше всего в запросе - PullRequest
7 голосов
/ 02 ноября 2011

Я понимаю, что с MongoDB для запроса, чтобы использовать составной индекс, он должен использовать ВСЕ ключи в индексе или, по крайней мере, некоторые из ключей, начиная слева.Например,

db.products.find({ "a":"foo", "b":"bar" })

С радостью воспользуется индексом, состоящим из {a, b, c}.

Однако, если я хочу сделать запрос:

db.products.find( {"a":"foo", "c":"thing" })

Я считаю, что это не может использовать индекс.Может ли это быть решено добавлением тривиального условия на «b», например,

db.products.find( {"a":"foo", "b":{ $ne : "" }, "c":"thing" })

Даже когда меня на самом деле не волнует значение b.Причина этого заключается в том, что у нас в настоящее время есть 45 млн. Объектов, и он будет продолжать расти, поэтому мы стремимся консолидировать наши индексы для экономии ресурсов.

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2011

Как правило, запрос по многостолбцовому индексу, который недостаточно ограничивает совпадения для одного из столбцов, ограничивает полезность многостолбцового индекса.В вашем примере использование критериев запроса {"a":"foo", "b":{$ne:""}, "c":"thing"} ограничит полезность индекса {a,b,c} совпадением только с a.Если ваши критерии запроса будут выполняться часто, создайте индекс {a,c,b} (или {a,c}, если b не будет использоваться в критериях запроса).

Используйте explainфункция на ваши запросы, чтобы увидеть, если индекс используется в полной мере.Если explain сообщает, что indexOnly равно true, то ваш запрос использует только индекс для поиска подходящих документов;в противном случае MongoDB необходимо просматривать каждый документ, чтобы найти совпадения.

Для получения дополнительной информации см .:

0 голосов
/ 02 августа 2012

Фактически, используя более новые версии Mongo, ваш индекс {a, b, c} будет использоваться, когда есть запрос к {a, c} без тривиальных условий для b.Я проверил это с помощью команды объяснения.

Здесь подробно обсуждается это: Тройной индекс Монго

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...