Почему query.get быстрее любой альтернативы? - PullRequest
0 голосов
/ 09 июня 2019

Для повышения производительности моего приложения flask я просто тестирую один запрос с разными подходами, использую магическую команду jupyter %timeit и выполняю следующие строки отдельно (комментарии показывают среднее время + - стандартное отклонение выполнения коды для нескольких раз).

u = User.query.get(39) # 32.1 µs ± 1.28 µs

u = User.query.filter_by(id=39).first() #97.8 ms ± 7.43 ms

u = db.session.query(User).filter_by(id=39).first() #89.2 ms ± 13.7 ms

u = db.session.query(User.id).filter_by(id=39).first() #74.6 ms ± 16.8 ms

Как вы видите, первый подход примерно в 1000 раз быстрее других подходов?

Кто-нибудь может объяснить, в чем разница между использованием query.get и другими методами?

Ответы [ 2 ]

4 голосов
/ 09 июня 2019

из-за query.get из сеанса, а не из базы данных, цитируется из sqlalchemy doc :

get () отличается тем, что обеспечивает прямой доступ к карте идентификации сеанса-владельца. Если указанный идентификатор первичного ключа присутствует в локальной карте идентификаторов, объект возвращается непосредственно из этой коллекции, и SQL не выдается, если только объект не был помечен как полностью истекший. Если он отсутствует, выполняется SELECT для определения местоположения объекта.

0 голосов
/ 09 июня 2019

Я думаю, что ответ @ georgexsh может быть более объяснительным. SQLAlchemy использует систему кэширования сеансов, а это означает, что все, что вы запрашивали из базы данных, сохраняется в памяти. Это означает, что каждый раз, когда вы вызываете .get(), SQLAlchemy сначала просматривает кэш, чтобы определить, были ли запрошенные данные уже загружены в память. Если это так, он готов для отображения, в противном случае он отправит запрос в базу данных.

Используя кэширование, .get() запросы обычно занимают меньше времени (обратите внимание, что после изменения в БД это займет больше времени). Это особенно полезно, если ваше приложение больше обслуживает, чем хранит.

Редактировать: Как указано в комментарии, сессия не является кешем, но, как указано в документации, сессия может быть интерпретирована как своего рода кеш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...