我应该在切片前N条记录之前对查询集进行反向排序,还是将其计数为切片后N条记录?

埃舍尔

假设我要在一个包含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条记录),答案是否会改变?

e4c5

这个会很慢

 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

声明切片还是制作切片?

来自分类Dev

如何对整数Go的切片进行反向排序?

来自分类Dev

切片字典

来自分类Dev

组成切片

来自分类Dev

AssertionError采取切片后无法过滤查询

来自分类Dev

切片指针

来自分类Dev

切片golang切片

来自分类Dev

如何按地图的值对切片进行排序

来自分类Dev

排序多维数组/切片

来自分类Dev

使用指向切片的指针进行切片

来自分类Dev

python切片后如何在SQL中获取查询结果中的记录总数

来自分类Dev

网格切片的排序算法

来自分类Dev

Golang:如何按星期几对切片进行排序?

来自分类Dev

从对象切片属性并计数

来自分类Dev

切片视图

来自分类Dev

如何以正确的顺序对DICOM切片进行排序?

来自分类Dev

切片功能反向-Python

来自分类Dev

将切片分成N个切片

来自分类Dev

如何在不改变原始切片的情况下对切片进行排序

来自分类Dev

每第n行对Pandas DataFrame进行切片

来自分类Dev

修改__getitem__后无法对列表进行切片

来自分类Dev

组成切片

来自分类Dev

javascript拆分还是切片?

来自分类Dev

Javascript / Angular在声明数组之前将其切片

来自分类Dev

如何对单条线的水平尾部进行切片

来自分类Dev

切片视图

来自分类Dev

Postgres 中切片数据集的 SQL 查询

来自分类Dev

在 Pandas 中对 DataFrame 进行排序和切片

来自分类Dev

反向查询集/列表,然后切片