Лучший способ сортировки по нескольким полям в запросе geonear - PullRequest
1 голос
/ 26 мая 2011

В MongoDB я делаю запрос geonear для коллекции, содержащей ~ 3,5 миллиона объектов, чтобы вернуть результаты около определенного широты / долготы. Этот запрос отлично работает, если у меня есть базовый 2d-индекс для объекта:

db.Listing.ensureIndex( { Coordinates: "2d" } );

Однако теперь я также хочу фильтровать по другим полям (Цена, Тип недвижимости, Год постройки, Кровати, Ванны и т. Д.) В запросе geonear. Когда я добавляю в запрос такие вещи, как Price <= 10000000, тогда запрос начинает замедляться. У меня нет никаких индексов по этим другим полям, поэтому мне интересно, какой лучший подход с точки зрения производительности. </p>

Я пытался добавить отдельные индексы для каждого из других полей (всего 11 индексов в коллекции), однако это приводило к истечению времени ожидания запроса каждый раз, я думаю, потому что коллекция может обрабатывать только столько индексов?

db.Listing.ensureIndex( { Coordinates: "2d" } );
db.Listing.ensureIndex( { Price: 1 } );
db.Listing.ensureIndex( { Beds: 1 } );
db.Listing.ensureIndex( { Baths: 1 } );
etc...

Теперь я подумываю о наличии только одного составного индекса в коллекции:

db.Listing.ensureIndex( { Coordinates: "2d", Price: 1, PropertyType: 1, YearBuilt: 1, Beds: 1, Baths: 1, HouseSize: 1, LotSize: 1, Stories: 1 } );

Это правильный подход или есть лучший способ?

1 Ответ

1 голос
/ 27 июня 2011

Да, составной индекс - это, вероятно, путь. Подробнее см. http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-CompoundIndexes.

Единственная проблема, которую я вижу здесь, состоит в том, что у вас есть много полей в этом индексе, что сделает его довольно большим, поэтому вы можете захотеть иметь индексы только для полей с высокой мощностью Используйте объяснение (), чтобы оптимизировать это.

Кроме того, учитывая ваш набор данных, может быть трудно поддерживать правильный баланс индекса (и, следовательно, он начнет попадать на диск, когда у него кончится физическая память), что значительно замедлит работу.

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