В mongodb существует несколько типов index. По этому вопросу меня интересует возрастающий (или убывающий) индекс, который можно использовать для сортировки, и хэш-индекс, который в соответствии с документацией "в основном используется с закрытыми кластерами для поддержки хешированных ключей осколка" (источник), обеспечивающий "более равномерное распределение данных" (источник)
Я знаю, что вы не можете создать индекс вроде: db.test.ensureIndex( { "key": "hashed", "sortOrder": 1 } )
, потому что вы получите сообщение об ошибке
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"errmsg" : "exception: Currently only single field hashed index supported.",
"code" : 16763,
"ok" : 0
}
Мой вопрос:
Между индексами:
-
db.test.ensureIndex( { "key": 1 } )
-
db.test.ensureIndex( { "key": "hashed" } )
Для запроса db.products.find( { key: "a" } )
, который более эффективен?, это клавиша hashed
O(1)
Как я попал на вопрос:
Прежде чем я узнал, что у вас не может быть многозначных индексов с hashed
, я создал индекс формы db.test.ensureIndex( { "key": 1, "sortOrder": 1 } )
, и, создав его, я задался вопросом, был ли хешированный индекс более результативным, чем восходящий (хеш обычно O(1)
). Я оставил ключ, как сейчас, потому что (как я уже упоминал выше) db.test.ensureIndex( { "key": "hashed", "sortOrder": 1 } )
не разрешалось. Но вопрос о хэшированном индексе быстрее для поисков с помощью ключа остался в моем сознании.
Ситуация, в которой я сделал индекс, была:
У меня была коллекция, содержавшая отсортированный список документов, классифицированных ключами.
например.
{key: a, sortOrder: 1, ...}
, {key: a, sortOrder: 2, ...}
, {key: a, sortOrder: 3, ...}
, {key: b, sortOrder: 1, ...}
, {key: b, sortOrder: 2, ...}
,...
Поскольку я использовал key
для классификации и sortOrder для разбивки на страницы, я всегда запрашивал фильтрацию с одним значением для key
и используя sortOrder
для порядка документов.
Это означает, что у меня было два возможных запроса:
- Для первой страницы
db.products.find( { key: "a" } ).limit(10).sort({"sortOrder", 1})
- И для других страниц
db.products.find( { key: "a" , sortOrder: { $gt: 10 } } ).limit(10).sort({"sortOrder", 1})
В этом конкретном сценарии поиск с O(1)
для ключа и O(log(n))
для sortOrder был бы идеальным, но это не было разрешено.