我进行了很多搜索,但没有找到以下问题的答案。我有一个记录很多的表(大约100M),并且我想对它运行以下查询:
Entity.objects.filter(creation_time__gte=some_date).order_by('id').all()[0]
我的桌子如下:
class Entity(models.Model):
creation_time = models.DateTimeField(null=True, blank=True)
# Other fields
答案 0 :(得分:1)
无论您针对哪个数据库运行该数据库,以及在creation_time字段上使用哪个索引,此查询都可能很慢。为什么?由于您的过滤器是一个不等式而不是一个等式,并且您正在将其与排序结合使用,因此请考虑一下,在最坏的情况下,您可能会排序99,000,000条记录。
您可以使用的一种方法是创建从创建时间派生的非串行主键。这里描述的有点像:https://stackoverflow.com/a/37605582/267540
您可以创建BTREE创建时间,然后执行查询以进一步过滤上限。
Entity.objects.filter(creation_time__gte=some_date
).filter(creation_time__lt=some_other_date).order_by('id').all()[0]
最后,您可以执行一个使用'only'的查询来仅获取主键,这将是对PostgreSQL的仅索引查询,并且可能会导致速度稍有提高。