【问题标题】:django reduce query load timedjango 减少查询加载时间
【发布时间】:2015-04-10 10:32:33
【问题描述】:

我使用 nginx 作为服务器。

使用 Django 加载简单的 html 页面时无需任何查询,加载时间仅为 34 毫秒。

<html><body><h1> Test</h1></body></html>

如果运行一些查询(查询中有 500 行),加载页面需要 4 秒。

views.py

def testing3(request):
        context = User.objects.all()
        return render_to_response('pages/index1.html',  {'users': context,})

index1.html

<html>
<head> <title>Testing  </title>    </head>
<body>
Testing
<h1>Testing</h1>
{% for e in users %}
<table>
        <tr> <td class="active">{{ e.username }}</td>
          <td>{{ e.email }}</td>    </tr>
</table>
        {% endfor %}
</body>
</html>

如何减少加载时间。

如何减少这个等待时间?

【问题讨论】:

  • 尝试使用SQL查询获取数据?
  • 你应该使用带有分页功能的 Django ListView 来按页面只显示少数用户。
  • 您实际上只是显示 500 个用户或其他可能执行其他复杂 SQL 操作的模型吗?
  • @PhucTran 你的意思是我必须使用 raw_sql?
  • @styts 实际上只是将用户显示到 html 页面

标签: python django nginx


【解决方案1】:

首先:优化您的数据库查询。

如果您只想显示几个数据库字段(在您的示例中为user.usernameuser.email)并且不需要任何模型方法,请改用ValuesQuerySet

def myview(request):
    users = User.objects.values("username", "email")
    return render_to_response('pages/index1.html',  {'users': users,})

如果您需要相关对象,请在查询中使用 "select_related" 关键字 arg 以避免“n+1 查询”问题。

完成此操作后,如果您的查询返回数百条或更多记录,您希望 paginate 查询集。这对于查询集特别有效,因为它使用 SQL offsetlimit 子句,因此分页实际上是在 db 级别完成的。

此时,您至少在 ORM/db 级别上应该已经有了显着的提升。如果渲染本身(模板级别)仍然需要太多时间,那么是时候考虑使用cache了。

【讨论】:

  • 感谢一些时间减少了,我的页面也有一些图像,加载也需要很长时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2011-05-27
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多