Редсандро,
Вы должны учитывать Index Cardinality
и Selectivity
.
1. Мощность индекса
Кардинальность индекса относится к тому, сколько возможных значений может быть для поля. Поле sex
имеет только два возможных значения. У него очень низкое количество элементов. Другие поля, такие как names, usernames, phone numbers, emails
и т. д., будут иметь более уникальное значение для каждого документа в коллекции, что считается высоким количеством элементов.
Большая мощность
Чем больше мощность поля, тем полезнее будет индекс, потому что индексы сужают пространство поиска, делая его гораздо меньшим набором.
Если у вас есть индекс sex
и вы ищете мужчин по имени Джон. Вы бы сузили область результатов примерно на 50 %, если бы сначала проиндексировали sex
. И наоборот, если вы индексируете по name
, вы немедленно сузите набор результатов до минутной доли пользователей по имени Джон, а затем обратитесь к этим документам, чтобы проверить пол.
Практическое правило
Попробуйте создать индексы по high-cardinality
ключам или сначала поместите high-cardinality
ключей в составной индекс. Подробнее об этом можно прочитать в разделе о составных индексах в книге:
Полное руководство по MongoDB
2. Избирательность
Кроме того, вы хотите использовать индексы выборочно и написать запросы, которые ограничивают количество возможных документов с индексируемым полем. Для простоты рассмотрим следующую коллекцию. Если ваш индекс {name:1}
, если вы запустите запрос { name: "John", sex: "male"}
. Вам нужно будет отсканировать 1
документ. Потому что вы позволили MongoDB быть избирательной.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Рассмотрим следующую коллекцию. Если ваш индекс {sex:1}
, если вы запустите запрос {sex: "male", name: "John"}
. Вам нужно будет отсканировать 4
документов.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Представьте возможные различия на большом наборе данных.
Небольшое объяснение составных индексов
Легко сделать неправильное предположение о составных индексах. Согласно документам MongoDB по составным индексам.
MongoDB поддерживает составные индексы, где одна структура индекса содержит ссылки на несколько полей в документах коллекции. На следующей диаграмме показан пример составного индекса для двух полей:
При создании составного индекса 1 индекс будет содержать несколько полей. Итак, если мы проиндексируем коллекцию по {"sex" : 1, "name" : 1}
, индекс будет выглядеть примерно так:
["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103
Если мы проиндексируем коллекцию по {"name" : 1, "sex" : 1}
, индекс будет выглядеть примерно так:
["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103
Наличие {name:1}
в качестве префикса значительно улучшит работу с составными индексами. . На эту тему можно прочесть гораздо больше, надеюсь, это внесет некоторую ясность.
person
Abdullah Rasheed
schedule
05.11.2015