假设我要在一个包含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条记录),答案是否会改变?
这个会很慢
data = MyModel.objects.filter(criteria=something)[index-50:]
为什么,因为它转化为
SELECT * FROM myapp_mymodel OFFEST (index-50)
您无需在此处强制执行任何排序,因此服务器将不得不计算结果集并跳转到结果集的末尾,这将涉及大量读取操作,并且速度非常慢。让我们不要忘记count()查询也不是那么热门。
哦,这个速度很快
data = MyModel.objects.filter(criteria=something).order_by('-pk')[:50]
您对主键进行了反向排序,并获得了前50个。您可以使用以下方法快速获取前50个
data = MyModel.objects.filter(criteria=something).order_by('pk')[:50]
所以这就是你真正应该做的
data1 = MyModel.objects.filter(criteria=something).order_by('-pk')[:50]
data2 = MyModel.objects.filter(criteria=something).order_by('pk')[:50]
在主键上订购的成本非常低。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句