У меня достаточно большой набор данных из более чем 3 миллионов документов, теги которых похожи на StackOverflow, который использует теги для каждого вопроса.Схема, которую я использую для хранения тегов, выглядит следующим образом:
{"id": 12345, "tags":["tag1", "tag2", "tag3"]}, {"id": 12346, "tags":["tag2", "tag3"]}
У меня есть многоключевой индекс, созданный для поля тегов.Когда я выполняю запросы с использованием операторов $ in или $ nin, чтобы найти пересечение, объединение тегов, на компьютере серверного класса производительность составляет около 7 секунд.Могу ли я что-нибудь сделать, чтобы улучшить скорость поиска по запросу?
РЕДАКТИРОВАТЬ 1:
Вот план объяснения по запросу.Я заметил, что запросы возвращались намного быстрее после того, как я перезапустил свой сервер и просто запустил только сервер mongodb.Запросы выполняются намного быстрее (<50 мс).Я подозреваю, что индексы не кэшировались в памяти, хотя у меня было достаточно свободного неиспользуемого ОЗУ, и мой индекс (800 МБ) мог легко поместиться в памяти. </p>
db.tagsCollection.find ({"tags": {$ in: ['tag1', 'tag2'], $ nin: ['tag4', 'tag5', 'tag6', 'tag7']}}) .explain ();{"cursor": "BtreeCursor tags_1 multi", "nscanned": 6145193, "nscannedObjects": 6145192, "n": 969386, "millis": 19640, "nYields": 0, "nChunkSkips": 0, "isMultiKey": true, "indexOnly": false, "indexBounds": {"tags": [["tag1", "tag1"], ["tag2", "tag2"]]}}
Примечание