MongoDB Одиночный или составной индекс для отсортированного запроса? - PullRequest
0 голосов
/ 18 мая 2019

Я использую mongoose, и у меня есть запрос, подобный следующему:

const stories = await Story.find({ genre: 'romance' }).sort({ createdAt: -1 })

Я хочу установить индекс для Story, чтобы этот тип запросов становился быстрее.

Какой из нихиз них лучший подход и почему:

1.Создайте один составной индекс с обоими полями:

Story.createIndex({genre: 1, createdAt: -1})

2.Создайте два отдельных индекса для каждого поля:

Story.createIndex({genre: 1})
Story.createIndex({createdAt: -1})

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Если «жанр» всегда будет частью поля поиска, использование составного индекса всегда приведет к повышению производительности.

1.) Составной индекс, состоящий из искомого поля и полячто он сортируется, может удовлетворять обоим условиям.

2.) Создание более одного индекса предполагает, что оба индекса будут использоваться при выполнении запроса, что не соответствует действительности.Концепция пересечения индекса применима только в нескольких случаях.В данном конкретном случае, поскольку у нас есть одно поле в критериях поиска, а другое - в сортировке, пересечение индекса не будет использоваться Mongo.( Ссылка ).

Так что в этой ситуации я бы использовал составной индекс.

1 голос
/ 18 мая 2019

Пока все ваши запросы, которые должны использовать поле createdAt, используйте поле genre, а также используйте составной индекс .

Давайте сравним двапараметры:

Запросы: Пока то, что я изложил выше, оба запроса будут вести себя одинаково , нет разницы между этими двумя, когда дело доходит до выполнения запросаскорость.

Память: Составной индекс будет использовать меньше памяти, что крайне важно, если у вас ограничено пространство ОЗУ.Давайте посмотрим на разницу на примере:

Позволяет иметь 3 документа:

{
 name: "john",
 last_name: "mayer"
}
{
 name: "john",
 last_name: "cake"
}
{
 name: "banana",
 last_name: "pie"
}

Теперь, если мы запустим db.collection.stats() в варианте 1, составной индекс получим:

totalIndexSize: 53248.0

Напротив для варианта 2:

totalIndexSize: 69632.0

Вставка: полное раскрытие Я понятия не имею, как это влияет на каждый.из небольших тестов кажется, что составной индекс немного быстрее, однако я не смог найти документацию по этому вопросу и не стал исследовать глубже.

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