Почему mongodb ищет по одному полю быстрее, чем по нескольким, даже если индексы существуют? - PullRequest
0 голосов
/ 21 февраля 2019

У меня большая база данных, и я пытаюсь оптимизировать запросы.Итак, у меня есть, например, коллекция, записи которой имеют такую ​​структуру:

{
"field1": "value",
"field2": "value",
"field3": "value"
}

У меня около 1 000 000 записей, поэтому я могу измерить производительность запросов.

Моя цель - оптимизироватьпоиск по field1 = 1 и field2 существует.

Сначала я пытаюсь без индексов:

db.Collection.aggregate({"$match": {"field1": 1, "field2": {"$exists": true}}}, {"$count": "count"})

Этот запрос занимает 1720 мс.Хорошо, давайте добавим индекс.

db.Collection.createIndex({"field1": 1, "field2": 1}, {"sparse": true})

Запрос теперь занимает 2212 мс.Какие?!Может быть, я должен стараться не разбирать индекс:

db.Collection.createIndex({"field1": 1, "field2": 1})

2225 мс.Хорошо.Давайте начнем эксперименты.Сколько времени занимает запрос только по одному полю без индексов?

db.Collection.aggregate({"$match": {"field1": 1}}, {"$count": "count"})

1456 мс

db.Collection.aggregate({"$match": {"field2": {"$exists": true}}}, {"$count": "count"})

1807 мс

Попробуем добавить индексы:

db.Collection.createIndex({"field1": 1}) db.Collection.aggregate({"$match": {"field1": 1}}, {"$count": "count"})

447 мс.Лучше.

db.Collection.createIndex({"field2": 1}) db.Collection.aggregate({"$match": {"field2": {"$exists": true}}}, {"$count": "count"})

322 мс.Тоже лучше.

Но как насчет двух полей?Я снова запрашиваю и получаю 1821 мс.

Что происходит?Я вижу в объяснении (), что индекс использует, но почему так медленно?Я думал, что запрос по двум полям будет быстрее, потому что условие field2 является частью условия field1, поэтому база данных может найти все строки с field1 = 10 по индексу, а затем найти все field2 из предыдущего набора строк.

Итак, как я могу оптимизировать этот запрос?Я думаю, что это может занять не более 700 мс.

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