【问题标题】:Improving performance of django DB query提高 django DB 查询的性能
【发布时间】:2012-01-28 23:47:33
【问题描述】:

我正在使用 django/apache/sqlite3,我有一个看起来像这样的 django 模型:

class Temp_entry(models.Model):
    dateTime = models.IntegerField() #datetime
    sensor = models.IntegerField()   # id of sensor
    temp = models.IntegerField()     # temp as temp in Kelvin * 100

我正在尝试将最后 300 个 Temp_entry 项目放入图表中。我是这样做的:

revOutsideTempHistory = Temp_entry.objects.filter(sensor=49).order_by('dateTime').reverse()[:300]

但是,此查询需要大约 1 秒。有没有办法改善这一点?我挖了一圈,发现order_by的效率太低了,所以我希望有一个可行的替代方案?

我想到的另一种方法,但不知道如何实现,是每 20 分钟运行一次查询并保持缓存,这也是可以接受的,因为数据可能有点陈旧而没有不良影响.

【问题讨论】:

    标签: python django performance sqlite


    【解决方案1】:

    如果caching 可以接受,则应始终使用它。比如:

    from django.core.cache import cache
    
    cached = cache.get('temp_entries')
    if cached:
        result = cached 
    else:
        result = Temp_entry.objects.filter(sensor=49).order_by('dateTime').reverse().values_list()[:300]
        cache.set('temp_entries', result, 60*20)  # 20 min
    

    您也可以为相应的列设置db_indexes

    class Temp_entry(models.Model):
        dateTime = models.IntegerField(db_index=True) #datetime
        sensor = models.IntegerField(db_index=True)   # id of sensor
        temp = models.IntegerField()     # temp as temp in Kelvin * 100
    

    【讨论】:

    • 谢谢 Alexey,两个后续问题:有没有办法让查询每 20 分钟运行一次,而不是等待请求检查它是否过时? db_indexes 有什么作用?
    • Andy,db_index 只是创建普通的数据库索引,这样会提高查询速度。但是,与缓存相比,这种加速是微不足道的。另请注意,像 Mysql 和 Postgre 这样的 DB 具有内部查询缓存,但不确定 sqlite。根据第一个问题:是的,您可以使用 django 命令以及 cron 或 celery 之类的东西,但我认为这不是一个好的解决方案
    • 感谢 Alexey,使用索引和缓存视图在可接受的时间内呈现
    【解决方案2】:

    好吧,如果您知道您的条目总是有一个递增的 dateTime(即 dateTime 是在创建条目而不是编辑条目时设置的),那么您不必按 dateTime 排序,因为它们自然会在数据库。

    【讨论】:

      【解决方案3】:

      您可能需要在数据库中添加更多索引。使用 django-debug 工具栏获取正在运行的实际查询的 SQL,并使用 EXPLAIN 功能显示它正在使用的索引。对于这个特定的查询,我想您需要在 (sensor, dateTime) 上添加一个索引 - 直接在数据库外壳中执行此操作。

      【讨论】:

      • 在此线程的另一条评论中,OP 询问了一个关于索引的作用的问题。我想我会为你指出这一点。
      【解决方案4】:

      约翰尼卡奇! http://packages.python.org/johnny-cache/ 它开箱即用,效果很好!

      【讨论】:

      • 很好的解决方案,虽然它有多好取决于您的 R/W 模式!
      猜你喜欢
      • 2017-11-23
      • 2019-05-23
      • 2013-08-03
      • 2017-04-12
      • 2012-10-30
      • 2021-11-22
      • 2021-08-03
      • 2013-02-17
      相关资源
      最近更新 更多