【发布时间】:2017-05-09 03:44:21
【问题描述】:
假设我想在一个有 1M 条记录的表中获取返回大约 10k 条记录的查询的最后 50 条记录。我可以(以订购的计算成本为代价):
data = MyModel.objects.filter(criteria=something).order_by('-pk')[:50]
我也可以这样做(以 2 次数据库命中为代价):
# assume I don't care about new records being added between
# the two queries being executed
index = MyModel.objects.filter(criteria=something).count()
data = MyModel.objects.filter(criteria=something)[index-50:]
对于在criteria 上没有索引的普通关系数据库,哪个更好(例如,在我的情况下是postgres;没有列存储或任何花哨的东西)?最重要的是,为什么?
如果表或查询集明显更大(例如,10M 行表中的 100k 条记录),答案是否会改变?
【问题讨论】:
-
当你使用
.filter时,Django 是否强加了一个有意义的顺序?通常,在 SQL 数据库中,最后 50 行 仅在使用order by或其等效项时才有意义。再次运行相同的查询可能不会以相同的顺序返回行。 -
我在创建仪表板的背景下提出这个问题,我只想在其中显示一些合理的近期客户评论。对于这种特殊情况,排序严格性并不重要。
-
相当近的在没有
order by或类似的情况下也毫无意义。 -
你说得对,我依赖于由自动增量 pk 排序返回的查询集,但它可能不是。同样,对于这个应用程序来说已经足够了。
标签: sql django postgresql