2012-07-07 3 views
1

У меня есть конкретная необходимость иметь особенно большое количество разреженных индексов в коллекции MongoDB. Вероятно, это число будет на низких тысячах. Каждый хранимый документ будет использовать лишь относительно небольшое количество индексов, в среднем около 10-30. Однако документы очень разнообразны и потребуют разных наборов индексов.Ограничение MongoDB на количество разреженных индексов

Я не могу найти никакой документации относительно вероятных последствий наличия> 1000 редких индексов в коллекции. Пространство не вызывает беспокойства. Моя особая забота - это влияние на экономию времени и настройку запроса. Будут ли MongoDB увязнуть с этими большими накладными расходами?

Я буду использовать свои собственные тесты, но я хотел бы знать: а) если кто-то знает некоторые официальные рекомендации по этому вопросу и б) имеет какой-либо опыт в этом сценарии.

ответ

1

Существует ограничение пространства имен (общее количество индексов, коллекции и т.д.), которые вы можете столкнуться, но которые могут быть сняты с --nssize: http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections

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

Следует иметь в виду, что вы не сможете использовать более одного индекса для каждого запроса без использования $ или, что является текущим ограничением в mongodb. http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-Oneindexperquery.

+0

Вы имеете в виду, что нет возможности одновременно искать несколько частично проиндексированных полей? – IamIC

+0

Ну, вы можете, используя $ или - каковы будут ваши шаблоны запросов? –

+1

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

1

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

Например, если у вас объекты:

{_id: 123, foo: 12} 
{_id: 124, bar: 13} 
{_id: 124, foo: 12, bar: 15} 

Вы могли бы иметь один разреженный индекс {foo:1, _id:1} и другой {bar:1, _id:1} и делать запросы, как find({foo:12}, {_id:1}) и find({bar:13}, {_id:1}), а затем OR или AND объект Идентификаторы в клиенте. Затем вы можете получить полные объекты только для соответствующих совпадений.

Примечание: извлекая только поле _id в поисковых запросах, Mongo может возвращать результаты из индекса и не нужно распаковывать какой-либо BSON, чтобы дать результаты, сделанные так быстро.

+0

Спасибо. Очень умно. – IamIC