| Это относится только к версии Cloud Firestore Enterprise. |
Для устранения проблем, связанных с медленными запросами, используйте функцию Query Explain , чтобы получить план выполнения запроса и профиль выполнения во время выполнения. В следующем разделе описаны шаги, которые можно предпринять для оптимизации производительности запросов в зависимости от профиля выполнения:
Ограничьте количество результатов
Используйте поле «records returned» в дереве выполнения, чтобы определить, возвращает ли запрос много документов. Рекомендуется ограничить количество возвращаемых документов с помощью предложения $limit . Это уменьшит сериализованный размер результатов в байтах при передаче клиентам по сети. В случаях, когда узлу Limit предшествует узел MajorSort , механизм запросов может объединить узлы Limit и MajorSort и заменить полную материализацию и сортировку в памяти сортировкой TopN, что уменьшит требования к памяти для запроса.
Ограничьте размер результирующего документа.
Рекомендуется ограничить размер возвращаемого документа, используя предложение $project чтобы избежать извлечения ненужных полей. Это помогает снизить вычислительные и оперативные затраты на обработку промежуточных результатов, а также размер сериализованных результатов в байтах при передаче клиентам по сети. В случаях, когда все поля, на которые ссылается запрос, охвачены обычным индексом (не мультиключевым), это также позволяет полностью охватить запрос сканированием индекса, избегая необходимости извлечения документов из основного хранилища.
Используйте индексы
Для настройки и оптимизации индексов воспользуйтесь приведенными ниже инструкциями.
Определите, использует ли запрос индекс.
Определить, использует ли запрос индекс, можно, проверив конечные узлы в дереве выполнения. Если конечный узел дерева выполнения является узлом TableScan , это означает, что запрос не использует индекс и сканирует документы из основного хранилища. Если индекс используется, конечный узел дерева выполнения отобразит идентификатор индекса и поля индекса.
Определите, можно ли оптимизировать используемый индекс.
Индекс полезен для запроса, если он может уменьшить количество документов, которые механизму запросов необходимо извлекать из основного хранилища, или если порядок полей в индексе обеспечивает выполнение требований запроса к сортировке.
Если для запроса используется индекс, но механизм запросов по-прежнему извлекает и отбрасывает множество документов, о чем свидетельствует узел Scan, возвращающий много записей, за которым следует узел Filter , возвращающий мало записей, это признак того, что предикат запроса, удовлетворяемый с помощью индекса, не является селективным. Чтобы создать более подходящий индекс, см. раздел «Создание индексов» .
Если для запроса используется не многоключевой индекс, но механизм обработки запросов все еще выполняет переупорядочивание результирующего набора в памяти, что определяется узлом MajorSort в дереве выполнения запроса, это означает, что используемый индекс не может обеспечить выполнение требований сортировки запроса. Для создания более подходящего индекса см. следующий раздел.
Индекс для $lookup
Для повышения производительности этапа $lookup создайте индекс по полю foreignField в коллекции from . Это позволит операции объединения эффективно находить совпадающие документы в коллекции from без сканирования всей коллекции.
Создание индексов
Для создания индексов следуйте инструкциям в документации по управлению индексами. Чтобы ваш запрос мог использовать индексы, создайте обычные (не мультиключевые) индексы с полями в следующем порядке:
- Все поля, которые будут использоваться в операторах равенства. Для максимального увеличения вероятности повторного использования в разных запросах, упорядочивайте поля в порядке убывания частоты их появления в операторах равенства в разных запросах.
- Все поля, по которым будет производиться сортировка (в том же порядке).
- Поля, которые будут использоваться в операторах диапазона или неравенства, в порядке убывания избирательности ограничений запроса.
- Поля, которые будут возвращены в рамках запроса в индексе: включение таких полей в индекс позволяет индексу охватывать запрос и избежать необходимости извлечения документа из основного хранилища.
Для запросов, включающих фильтрацию и сортировку полей массивов, рекомендуется создавать индексы с несколькими ключами.
Используйте подсказку запроса
Если вы создали более подходящий индекс для запроса, но механизм обработки запросов его не использует, вы можете переопределить предпочтительный индекс механизма обработки запросов, используя подсказку запроса.
Для получения дополнительной информации о результатах выполнения запроса с помощью Query Explain см. справочник по выполнению запросов .