【问题标题】:Optimized Django Queryset优化的 Django 查询集
【发布时间】:2015-12-28 16:45:40
【问题描述】:

我有以下函数来确定谁下载了某本书:

@cached_property
def get_downloader_info(self):
    return self.downloaders.select_related('user').values(
        'user__username', 'user__full_name')

由于我只使用两个字段,所以在其余字段上使用.defer() 有意义吗?

我尝试使用.only(),但我收到一个错误,指出某些字段不是 JSON 可序列化的。

我愿意接受所有优化此查询集的建议(如果有的话)。

谢谢!

【问题讨论】:

  • 您检查了生成的查询吗?示例:self.downloaders.select_related('user').values( 'user__username', 'user__full_name').query 你可以分析它是否真的值得进一步优化
  • @karthikr 我在哪里可以找到输出以查看是否应该优化?
  • 你使用的是什么数据库后端?
  • @TommasoBarbugli 我正在使用 PostgreSQL

标签: django django-models django-queryset


【解决方案1】:

在尝试所有可能的优化之前,您应该掌握 ORM 生成的 SQL 查询(您可以使用 print it to stdout 或使用类似 django debug toolbar 的东西),看看它有什么慢的地方。之后,我建议您使用EXPLAIN ANALYZE 运行该查询,并找出该查询的缓慢之处。如果查询很慢,因为必须传输大量数据,那么使用onlydefer 就更有意义了。仅当您需要检索大量数据时,使用onlydefer(或values)才能为您提供更好的性能,但它不会使您的数据库工作变得更容易(除非您真的必须读取大量数据当然)。

由于您使用的是 Django 和 Postgresql,因此您可以使用 manage.py dbshell 获取 psql 会话并使用 \timing 获取查询时间

【讨论】:

  • 即使只是一点点帮助,优化每个方面不是很有意义吗?不过,我刚刚安装了 Django 调试工具栏,谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-02-22
  • 2018-11-08
  • 2019-07-21
  • 2011-10-08
  • 2012-03-19
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多