Распространенные ошибки, которые приводят к проблеме запроса n+1, как правило, вращаются вокруг того, как данные избираются из базы данных, особенно при использовании картирования объектно-реламентального картирования (ORM) или вручную записи запросов базы данных. Вот подробные объяснения этих ошибок:
** 1. Получение связанных данных в отдельных запросах
Основной причиной задачи запроса n+1 является структурирование кода, чтобы сначала получить список записей с одним запросом, а затем выполнение дополнительного запроса для каждой записи для получения связанных данных. Например, запрос список пользователей, а затем отдельно запросить посты для каждого пользователя приводит к 1 запросу для пользователей плюс N запросов для сообщений, где n - количество пользователей. Это приводит к многим небольшим запросам вместо одного оптимизированного запроса [1] [2] [3] [7].
** 2. Полагаясь на ленивую загрузку по умолчанию
Большинство ORM используют ленивую загрузку в качестве стратегии извлечения по умолчанию, что означает, что связанные объекты получают только при явном обращении. Хотя это может сохранять ресурсы, если связанные данные не требуются, это заставляет запустить несколько запросов при итерации по сравнению с коллекциями, что неосознанно вызывает проблему N+1. Например, доступ к автору каждого сообщения в блоге индивидуально запускает отдельный запрос на пост [5].
** 3. Слебо повторно использует запросы без контекстуальных корректировок
Повторное использование одного и того же запроса в разных частях приложения без адаптации его может вызвать ненужные извлечения данных и усугубить проблему N+1. Запросы, которые не оптимизированы для конкретных вариантов использования, могут приносить неполные данные, предлагая дополнительные запросы для получения соответствующей информации позже [8].
** 4. Не используя технологии энергичной загрузки или оптимизации запросов
Неспособность использовать нетерпеливую загрузку (извлечение связанных данных в начальном запросе) или оптимизированные соединения приводит к нескольким обратному обработке в базу данных. Это происходит, когда разработчики явно не обучают своим ORM или Сбортеру запросов нагружать связанные объекты вместе, что приводит к многим небольшим запросам вместо одного, эффективного [5] [6] [7].
** 5. Игнорирование воздействия множества обработок в базу данных
Разработчики иногда предполагают, что многие небольшие запросы быстрее, чем один сложный запрос, но каждый запрос включает в себя задержку сети и накладные расходы. Совокупный эффект запросов N+1 значительно замедляет время отклика приложения и увеличивает нагрузку базы данных, особенно по мере увеличения объема данных [1] [3] [5].
** 6. Отсутствие осознания или обнаружения проблемы
Поскольку каждый отдельный запрос в шаблоне N+1 работает быстро, он часто не появляется в медленных журналах запросов или инструментах мониторинга, что делает его молчаливым убийцей производительности. Разработчики могут не заметить проблему до тех пор, пока отзывчика приложения не разлагается значительно [2] [5] [7].
Таким образом, задача запроса n+1 возникает в основном из-за неэффективных моделей извлечения данных, конкретно, запрашивая связанные данные в отдельных запросах для каждой записи, а не с пакетированием или соединением запросов. Это часто вызвано по умолчанию ленивой загрузки в ORM, неспособностью использовать нетерпеливую нагрузку или пакетирование, а также повторное использование общих запросов без оптимизации. Результатом являются чрезмерные обратные познания базы данных, которые разлагают производительность и масштабируемость [1] [2] [3] [5] [6] [7].
Цитаты:
[1] https://planetscale.com/blog/what-is-n-1-query-problem-and-how-to-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-Relational-картирование
[3.]
[4] https://evnedev.com/blog/development/the-n1-query-problem-what-is-it-and-how-do-you-solve-it/
[5] https://digma.ai/n1-query-problem-and-how-te-detect-it/
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_avoiding-the-n1-query-problem-a-common-activity-7270527662970818561-zmz6
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-these-7-sql-mistakes-for-better-database-management/