【问题标题】:Speed up Django query加快 Django 查询
【发布时间】:2018-11-07 02:09:27
【问题描述】:

我正在使用 Django 创建一个显示多种数据的仪表板。我的问题是,尽管我总是访问数据库(PostgreSql)一次,但页面加载速度很慢。这些表每 10 分钟加载一次数据,因此目前包含数百万条记录。我的问题是,当我使用 Django ORM 进行查询时,我获取数据的速度很慢(根据 Django 工具栏,它是 1.4 秒)。我知道这不是太多的 b 是总加载时间的一半 (3,1),所以如果我可以减少查询的时间,页面加载可能会减少到那里,因为用户体验会更好。当查询运行时,我获取 ~ 2800 行。有什么方法可以加快这个查询?我不知道我做错了什么,或者这个时间对于这么多的数据是正常的。我附上我的查询和模型。提前感谢您的帮助。

我的查询(这里我获取 6 小时的时间间隔。):

  my_query=MyTable.filter(time_stamp__range=(before_now,  now)).values('time_stamp',  'value1', 'value2')

这里我尝试使用 .iterator(),但查询速度并不快。

我的模特:

class MyTable(models.Model):
        time_stamp = models.DateTimeField()
        value1 = models.FloatField(blank=True, null=True)
        values2 = models.FloatField(blank=True, null=True)

【问题讨论】:

  • 如果您在 CLI postgres 客户端中手动运行相同的查询需要多长时间?如果大部分时间都花在数据库本身上,那么您的问题的答案与 Django 无关。提示:如果time_stamp 具有足够的区分能力(=> 您只有极少部分的mytable 记录共享相同的 time_stamp 值)您可能需要对其进行索引。
  • 我不确定,用户真正需要所有 2800 字符串可能是您可以查看分页吗?
  • 在控制台中我运行了相同的查询,我得到了这个Execution time: 753.086 ms,我的 Django 调试工具栏显示了这个 1439,04 秒。
  • 控制台和 django 应用程序从同一台服务器运行?请从工具栏显示 iscreen。
  • 是的,它们正在运行。我编辑了我的问题。

标签: django django-queryset django-orm sqlperformance


【解决方案1】:

添加index

class MyTable(models.Model):
    time_stamp = models.DateTimeField()
    value1 = models.FloatField(blank=True, null=True)
    values2 = models.FloatField(blank=True, null=True)

    class Meta:
         indexes = [
             models.Index(fields=['time_stamp']),
         ]

不要忘记在此之后运行 manage.py makemigrationsmanage.py migrate

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多