【问题标题】:What is the best index for postgresql timestamppostgresql时间戳的最佳索引是什么
【发布时间】:2019-01-27 13:49:29
【问题描述】:

我搜索了很多,但没有找到以下问题的答案。我有一张有很多记录的表(大约 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上的一个简单的B树索引吧?
  • 我想要在某个特殊时间后创建的对象的最小 ID。我不知道整个对象的最小 ID 是多少
  • @LaurenzAlbe 使用 b_tree 查询仍然非常缓慢,需要数十分钟才能执行
  • 请在问题中描述您的任务。不是解决方案。什么是“特殊时间”,为什么是“最低ID”等等。

标签: python django python-3.x postgresql


【解决方案1】:

无论您针对什么数据库运行此查询,以及您在 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 的索引查询,并且可能会稍微加快速度。

【讨论】:

  • 使用您提供的链接(第一个解决方案)我该如何进行查询?
  • 这必须作为一个单独的问题发布。
猜你喜欢
  • 2012-05-23
  • 2011-04-22
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2011-03-04
  • 2016-03-21
相关资源
最近更新 更多