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

时间:2018-08-21 11:20:37

标签: python django python-3.x 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

1 个答案:

答案 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的仅索引查询,并且可能会导致速度稍有提高。