postgresql 时间戳的最佳索引是什么



我已经搜索了很多,但没有找到以下问题的答案。我有一个有很多记录的表(大约 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

无论您针对哪个数据库运行此查询以及在creation_time字段上使用什么索引,此查询都可能很慢。为什么?因为您的过滤器是不等式而不是相等的,并且您将其与排序相结合,因此在最坏的情况下,您可能会对 9900 万条记录进行排序。

可以使用的一种方法是创建从创建时派生的非串行主键。有点像这里描述的: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的仅索引查询,并可能导致略微加快速度。

最新更新