RAW HTTP Response Body在body字段中,其中包含大量内容,在Project模型下面有32k个对象。class Project(models.Model):
body = models.TextField(null=True,blank=True)body上执行过滤只需几秒钟。>>> Project.objects.filter(body__icontains='x').count() ### 5-6 seconds
20472我使用Django分页器对每个页面的数据进行切片。
>>> from django.core.paginator import Paginator
>>> data = Project.objects.filter(body__icontains='x')
>>> p = Paginator(data,10)
>>> p.page(1) ### takes 5-6 seconds here again because this function counts the total number of pages based on data.count()
<Page 1 of 2048>{% for each_data in data %}
{{ each_data.body }}
{% endfor %}使用常规Python切片:
>>> data = Project.objects.filter(body__icontains='x')
>>> for each_data in data[0:10]: ### 0.1 seconds
print(each_data.body)Paginator函数计算每个页面的过滤结果的总页数时,查询速度会变慢。使用切片功能的缺点是:
是否有任何方法来解决这个问题,以获得更快的结果和分页?
发布于 2020-01-14 12:02:32
为什么会发生这种事?
考虑一下这个例子:
Project.objects.filter(body__icontains='x').count()这将被转换为这个查询(PostgreSQL):
SELECT COUNT(*) AS res
FROM project
WHERE UPPER(project.body::text) LIKE UPPER('%x%')如果有很多记录,这将是非常缓慢的。@bruno建议--尝试找到一种优化它的方法(它可能取决于您的RDBMS)。
Django中的经典分页是通过限制和偏移SQL语句实现的。其结果是:
计数-(执行时间: 10.7s)
偏移量X - DB需要在进行适当排序后从磁盘读取X记录;如果已将新元素插入到已被请求的页面中,则无效元素列表。
通常,计数是散列的,当添加新记录时,我们只需进行更新。偏移量很难优化(缓存?)。
有没有更好的解决办法?
密钥集分页,算法如下:
FIRST_TIMESTAMP和最后一个LAST_TIMESTAMP元素的标识符,例如,这可能是发布日期。WHERE table.date > LAST_TIMESTAMP ORDER_BY date ASC LIMIT <PAGE SIZE> 优势:
Disadvantages:
因此,如果是您的情况,您可以显着地加快分页。
https://stackoverflow.com/questions/59728094
复制相似问题