2012-10-15 5 views
1

У меня есть два поля и б, где б имеет значительно более высокую селективность, чем .Соединения порядка, основанный на поле селективности

Теперь, если я только запрашивая на обоих в и б (никогда на любом поле само по себе), что из двух индексов лучше и почему:

  1. {a: 1, b : 1}
  2. {b: 1, a : 1}

Объяснение, похоже, возвращает почти одинаковые результаты, но я где-то читал, что сначала следует поместить более высокие поля избирательности. Я не знаю, почему это имеет смысл.

+0

Рискну предположить, что второй показатель лучше, но вы должны проверить это. Запустите объяснение по обоим запросам. –

+0

@SergioTulentsev обновленный вопрос ... объяснить, похоже, одинаково для обоих. –

+0

Вы знаете, как они говорят: «Если вы не видите разницы, их нет». :) –

ответ

1

После выполнения дополнительного анализа двух индексов на самом деле в значительной степени идентичны с точки зрения производительности.

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

0

Я считаю, что Оптимизатор выберет индекс лучше использовать, хотя вы можете предоставить подсказки

например

db.collection.find({user:u, foo:d}).hint({user:1}); 

см http://www.mongodb.org/display/DOCS/Optimization

+0

Хотя это правда, это тихий общий ответ, применимый к почти ** любому ** сценарию и запросу Mongo. К сожалению, это не очень полезно для этого конкретного вопроса. –

+0

fair point - но я действительно предлагал использовать 'hint()', чтобы вы могли сравнить производительность каждого индекса? (у меня нет btw), но логически имеет смысл индексировать сначала наименее избирательный атрибут, тогда у вас меньше записей для сортировки или подфильтра. в конечном счете, хотя ваш индекс должен отражать запросы, которые вы хотите выполнить. Извиняюсь, если ответ все равно не помог. – sambomartin

4

После некоторых обширная работа по улучшению запросов на базе 150-000 000 записей я узнал, что следующие:

не обязательно более высокие поля селективности, но на самом деле поля, которые являются «быстрее», чтобы соответствовать, будучи движимы к первая позиция может повысить производительность резко

Я индекс состоит из следующих полей:

почтовый индекс, адрес, город, имя, фамилия

Адрес подобран в ARRA y, а не string = string, поэтому требуется больше времени для выполнения и является самым медленным для соответствия. Мой первый индекс, который я создал, был: address_zip_city_last_name_first_name, а время выполнения для сопоставления 1000 записей по всей БД будет часами.

Поле адреса на самом деле, вероятно, имеет самую высокую избирательность на них, но поскольку оно не соответствует простому равенству строк, оно занимает больше всего времени. Это на самом деле идет что-то вроде этого

{ address: {$all : ["1233", "main", "avenue] }} 

Изменяя этот индекс к иметь «быстрые» поля в начале, например: zip_city_first_name_last_name_address выступление было намного лучше. Те же 1000 записей будут совпадать всего за одну секунду, а не часами.

Надеется, что это помогает кому-то

приветствий