Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中查找给定时间段的最新条目的更快方法_Python_Mysql_Django - Fatal编程技术网

Python 在Django中查找给定时间段的最新条目的更快方法

Python 在Django中查找给定时间段的最新条目的更快方法,python,mysql,django,Python,Mysql,Django,我有一个包含以下字段的基本事件模型: 时间戳 钥匙 描述 我需要在给定日期之前返回给定密钥的最新描述值。在正常情况下,我将使用以下查询: desc = Event.objects.filter(key=key,time_stamp__lte=date).order_by('-id').values_list('description',flat=True)[0] 然而,在本例中,模型有250万条记录,因此执行大约需要15秒。通过指定一个时间戳范围,我成功地在速度上获得了一点小小的提高,但这

我有一个包含以下字段的基本事件模型:

  • 时间戳
  • 钥匙
  • 描述
我需要在给定日期之前返回给定密钥的最新描述值。在正常情况下,我将使用以下查询:

desc = Event.objects.filter(key=key,time_stamp__lte=date).order_by('-id').values_list('description',flat=True)[0]
然而,在本例中,模型有250万条记录,因此执行大约需要15秒。通过指定一个时间戳范围,我成功地在速度上获得了一点小小的提高,但这限制了最新条目可以追溯到我并不真正想要的距离

我已经做了一些测试,order_by('-id')是减慢速度的原因


我正在考虑将事件模型拆分为事件键类型的模型。这将减少每个模型的记录数,但在我开始这一过程之前,是否有人可以推荐一种更快的方法来获取查询集的最后一条记录?

您应该尝试使用db index


“order_by('-id')是使其变慢的原因。”,那么您可能已经按升序设置了默认顺序,使其反向可能会有帮助我已经测试过在模型元中设置顺序,但这会生成与我在过滤器上设置顺序时相同的SQL查询,不幸的是,它并没有提高性能。删除
值\u list()
有帮助吗?您可以这样做:
Event.objects.filter(key=key,time\u stamp\u lte=date)。order\u by('-id').first()。description
usingvalues\u list只返回所需的列,所以速度稍微快一点,但我测试了您的建议,除了返回的列之外,它还生成相同的SQL。基本上,我尝试过的所有方法都会生成一个SQL查询,以“
”结束。按“事件”排序。“id”DESC LIMIT 1
谢谢您的回答。我试过了,但不幸的是,它似乎没有什么不同。显然,出于某种原因,MySQL不支持反向索引。从您链接的Django文档:例如,索引(字段=['headline','-pub_date'])将使用(headline,pub_date DESC)创建SQL。MySQL不支持索引排序。在这种情况下,将创建一个降序索引作为普通索引。我再次检查,发现我在最初的索引测试中只包含了“-time_stamp”。在将其他字段添加到索引并阅读了索引定义顺序的重要性之后,我非常高兴地报告,查询时间下降到了不到一秒钟!非常感谢。
from django.db import models    

class Event():
    key = ...
    time_stamp = ...

    class Meta:
        index = [
            models.Index(fields=['key', '-time_stamp']),

    ]