gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:41:23 25 4
gpt4 key购买 nike

假设我想在一个包含 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;没有列式存储或任何花哨的东西)?最重要的是,为什么?

如果表或查询集大得多(例如,1000 万行表中的 10 万条记录),答案是否会改变?

最佳答案

这个会很慢

 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]

在主键上排序的成本非常低。

关于sql - 我应该在切片前 N 条记录之前对查询集进行反向排序,还是将其计数以切片最后 N 条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41301383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com