У меня большая база данных, и я пытаюсь оптимизировать запросы.Итак, у меня есть, например, коллекция, записи которой имеют такую структуру:
{
"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 мс.