Мне нужно проиндексировать коллекцию по двум полям (уникальный индекс), скажем, field1 и field2. Какой подход лучше с точки зрения производительности:
Создать обычный двухколонный индекс
-или -
Объединить эти два поля в одном поле документа {field1: value, field2: value2} и проиндексировать это поле?
Примечание: я всегда буду запрашивать эти два поля вместе.
Вы можете хранить отдельные столбцы и создать один индекс, который повысит производительность при одновременном запросе обоих полей.
db.things.ensureIndex({field1:1, field2:1});
http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes
Наличие столбцов в одном столбце обеспечиваетпроизводительность не увеличивается, поскольку вы должны индексировать их одинаково:
db.things.ensureIndex({fields.field1:1, fields.field2:1});
http://www.mongodb.org/display/DOCS/Indexes#Indexes-EmbeddedKeys
Или вы можете проиндексировать весь документ
db.things.ensureIndex({fields: 1});
http://www.mongodb.org/display/DOCS/Indexes#Indexes-DocumentsasKeys
Возможен рост производительности, но, несомненно, очень.Используйте тестовую базу данных, создайте тестовые данные и сравните тесты с некоторыми, чтобы понять это.Мы будем рады услышать ваши результаты.
Я бы создал составной индекс по обоим полям.Это займет меньше места на диске, потому что вам не нужно будет хранить дополнительное комбинированное поле, и даст вам бонус дополнительного индекса над первым полем, то есть индекс более { a:1, b:1 } также индекс более { a:1 }.
{ a:1, b:1 }
{ a:1 }