Оптимизация Django. 3 - Оптимизация ORM-query
Вставка
- Опубліковано 31 тра 2024
- 00:00 про ORM и SQL
02:15 как логировать SQL query
07:20 находим источники SQL запросов в коде
12:30 делаем prefetch_related
17:43 класс Prefetch для ORM
20:25 select_related
24:25 делаю git commit и git push
24:43 добавляем вложенный сериализатор
27:15 устраняем проблему n+1
31:25 на что обратить внимание при разработке view
Спасибо, за урок.
Такой код сделает только один запрос в бд в приведенном в видео случае с нужными полями
queryset = Subscription.objects.all().select_related('plan', 'client', 'client__user').only(
'client__user__email',
'client__company_name',
'plan_id',
)
Большое спасибо за урок! Благодаря ему в моем пет проекте теперь нет проблемы n+1, а кол-во запросов снизилось с 20+ до 6
Супер! Рад что помогло
Прикольно, что внутри Prefetch можно сделать select_related, это полезно
Огромное количество полезнейшей инфы понятнейшим языком. Просто топ.
Спасибо за озвучку интересных тем
Про prefetch_related знал, но про сам класс Prefetch и отдельную выборку полей круто)
Отличное видео. Шаг за шагом всё работает при повторении на собственном компьютере.
Благодарность автору.
Очень крутой и полезный видос
Тимлиду подкинулы твой курс- теперь пересматриваю опять чтобы внедрить в проект) Спасибо!
Хороший у вас тимлид! 😁
Выходные здорового человека - курс от Алексея :)
вы серьезна? здорового? самого-самого нормального здорового человека? потратить выходные на этот курс...
А вы чем в выходные занимаетесь?
Спасибо за ваш труд!
Наглядно и понятно, спасибо!
Благодарю за урок
Спасибо большое. Очень доступно. Я бы с удовольствием глянул видео про тестирование проектов на Джанго
Спасибо вам. Есть одно видео про юнит тесты. В синем курсе. Но там достаточно базовая информация. Про тестировании логики сложно рассказать без реального приложения
@@SeniorPomidorDeveloper хотелось бы именно полноценнный курс. Может быть, когда будет время, сделаете ☺️
100% нужная тема, с ростом количества записей в бд рано или поздно это придется делать.
Ага. Особенно когда одним prefetch можно вместо 500 запросов сделать 1.
спасибо!😎
Это прекрасно.
Знакомые лица! )
А как уменьшить количество запросов, когда мы в коде итерируемся по queryset и обращаемся отдельно к каждому элементу? select_related или prefetch_related (честно говоря, не понял разницу)?
Один для связи one to one, другой для связи one to many
Типа делать одним запросом с prefetch_related или select_related выборку всего что тебе нужно, а потом уже в цикле работать с данными, чтобы при каждой итерации в базу не лазить. Как раз такая задача на неделе была, целый день запрос писал.
Grazie Senior
Огромное спасибо за видео, я лишь хотел сказать , что с апи запросами можно работать тулбаром с django-debug-toolbar-force
А для celery тасков будет работать?
@@SeniorPomidorDeveloper я не пробовал) только учусь, Celery только вчера начал пробовать
Ага. Ну toolbar наверно подразумевает, что он подключен к чему-то. Это же «менюшка». А логирование, в этом смысле больше универсальная штука .
@@SeniorPomidorDeveloper Спасибо! и еще раз огромное спасибо за курс!
Болею, но смотрю)))
👍
Здравствуйте, благодарю за прекрасный курс!
Хотел у вас спросить, зачем мы используем prefetch_related, если у модели Subscription только FK связи? Ведь prefetch_related используется только для M2M связей...
Спасибо. Prefetch related используется для m2m , а также для FK связей , при обращении с другой стороны связи
@@SeniorPomidorDeveloper благодарю за ответ! Кстати, вы планируете делать новые курсы? У вас к этому делу настоящий талант, я уже все ваши курсы пересмотрел и столько узнал, сколько за 2 месяца обучения не видывал.
Возможно кое-что ближайшее время сделаю. Но таких больших курсов пока не планирую .
@@SeniorPomidorDeveloper буду с радостью ждать. Извините за мою наглость, но может вы посоветуете в двух словах как двигаться дальше и что вообще изучать?
@@begula_chan Делайте свой проект и применяйте там полученные знания. Другого способа нет. Ну или сразу работу найти, если получится
Здравствуйте, Помидор!
Можно узнать какой у вас MAC и какие у него характеристики?
Добрый день!
Это MacBook Air M1 16Gb RAM 256SDD. Для работы на крупном проекте python/django хватает.
Для большего комфорта взял бы больше SSD , но вцелом мне хватает , если сочетать с iCloud.
Привет, спасибо за видео. Было бы классно устраивать раз в неделю прямую трансляцию и поотвечать на вопросы по пройденным темам, что думаешь?
Немного влом) Но посмотрим, может по окончанию курса что-то такое сделаю.
Сейчас у тебя все-равно на endpoint делается 3 запроса: subsctiptions, plans и client.
Можно ли и как объединить это в одну цепочку джойнов?
Есть идеи? )
Что скажешь про objects.values()? Кажется, здесь можно было кратенько через этот метод написать
Можно все что угодно.
thanks
Я как понимаю в джанго нет подзапросов как raw sql или sqlalchemy чтобы за один запрос вывести все данные?
есть. Subquery называется
Ага. И raw sql тоже можно делать
классное видео, можно использовать "select_related()"
вместе "prefetch_related()" они оба работают одинаково?
Работают по разному , но совмещать можно
github.com/chepe4pi/service_app
Когда у модели много полей с внешним ключом (ForeignKey), лучше использовать метод prefetch_related.
Привет! Спасибо еще раз за видео. Немножко нагло с моей стороны, но все же попробую: а ты не можешь выкладывать по несколько видео в день, очень хочется закончить курс за новогодние праздники.Спасибо большое!
Я их параллельно доделываю, наверное не успею по два в день делать.
@@SeniorPomidorDeveloper все равно спасибо, прекрасный курс
Спасибо за отличное видео!
При добавлении Logging в сеттингах выходит ошибка:
ValueError: Unable to configure handler 'console'
ModuleNotFoundError: No module named 'Logging'
как можно исправить скажи пожалуйста ?
Может с маленькой буквы надо написать ?
Можно сверить с кодом тут github.com/chepe4pi/service_app/blob/day-3-1/service/service/settings.py
А как в данном примере через ORM сделать один SQL-запрос? На SQL можно через JOIN'ы сделать, а вот через ORM не понимаю как это возможно.
P.S. отличная тема для обсуждения, оптимизация наше всё.
Через raw() это делается .
А join’ы нам автоматически формирует select_related и prefetch
если .prefetch_related('plan') заменить на .select_related('plan') вместо 3 запросов будет 2, потому что будет джоин Subscription вместе с Plan таблицей.
Насколько мне известно, prefetch related и select related, сделаны для разных видов связей .
Я проект уже удалил , но может кто-то из подписчиков перепроверит, интересно найти самый оптимальный вариант
select_related для O2O, FK, а prefetch_related для M2M
Спасибо, все круто, но как настроить вывод в pycharm console?
Если PyCharm professional там вроде по умолчанию это работает
@@SeniorPomidorDeveloper а еже ли я из простого народа, просто сталкивался раньше с этим, не могу никак найти решения в тыртырнете, мистор сеньер помидор. абалденный ник
Спасибо 😁
Не очень понял что имеется ввиду. Если консоль Джанго то это только а Pro версии. Если терминал ОС то он вроде в любой версии и настраивать его не надо
@@SeniorPomidorDeveloper Проблема была не в том что я запускал из pycharma, а неизвестно где, ибо я только что запустил из консоли и там тоже ничего не выводиться.
@@SeniorPomidorDeveloper ладно, как обычно ахах, было django.db.backend а не django.db.backends
А можно ссылку на гитхаб?
github.com/chepe4pi/service_app
я так понимаю тут минимум 3 запроса будет всегда , 1 запрос для таблицы Subscription ('id','plan) 2 запрос для таблицы Client('client_name','email') а 3 запрос для Plan ("plan") , где мы прогнали его через отедльный сериализатор , и вот все эти префетч селектед , релейтед это чтобы не брать ненужные поля ? получая оптимизацию ? , сложно представить эту абстракцию , как все происходит ):
Нет, prefetch и select related именно чтобы запросы экономить. А точнее чтобы избавится от проблемы n+1 . Ненужные поля убираем через only.
Конечно, какой-то минимум запросов всегда будет.
sql алхимия топ, там если не указать доп связь она просто не выдаст тебе данные из другой модели и не создаст кучу запросов
Не очень удобно для разработки. Но наверное это скорее плюс , чем минус, что надо постоянно о связях думать
@@SeniorPomidorDeveloper А Вы лично работали с алхимией? не планируете ли сделать в будущем курс по Fastapi?
Немного работал. Возможно сделаю, пока особенно времени нет (
+
Очень крутой курс, жаль только используется в не полноценный пайчарм, а обрубок в виде комьюнити эдишн
Согласен. Сам об этом жалею , у меня много лет Pro. Проблема что использовать в курсе платный инструмент - это не очень правильно, 99% зрителей не будут его ради курса покупать . Тем более что JetBrains мне пока ничего за рекламу не платит )
@@SeniorPomidorDeveloper если на макбук денег хватает, то и на стоящий инструмент в виде програмного обеспечения можно накопить. А брейнсы только англоязычных блогеров подкармливают судя по роликам
У меня на макбук хватает, но наверно не у всех. Тем более сейчас проблемно купить с российской карты.
@@SeniorPomidorDeveloper купить можно через биток потратив 20 минут, чтобы разобраться при желании. К тому же торенты работают исправно или на крайняк абуз пробника от брейнсов
На Степике за прохождение заданий дают промокоды на полгода профи эдишн.
расскажите пожалуйста как желать дамп базы и засеивать подготовленными данными чистую бд. когда делаю волюм с бд и потом примонтировав его в другом месте - база крашится (./data:/var/lib/postgresql/data/)
Спросите в группе в телеграмме, ссылка в профиле
покажешь как с апи twitter facebook tiktok telegram google работать?
Нет