首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django过滤器图标在TextField()上计数慢

问Django过滤器图标在TextField()上计数慢
EN

Stack Overflow用户
提问于 2020-01-13 14:32:45
回答 1查看 1.2K关注 0票数 0
代码语言:javascript
复制
response_title = models.TextField(null=True,blank=True)
response_status_code = models.IntegerField(null=True,blank=True)
response_body = models.TextField(null=True,blank=True)

最近,我的站点的性能一直很慢,所以我从Django shell中观察到,我的模型中有32k个条目&与contains相比,count on icontains查询的执行速度慢,count on icontains查询花费了4秒,而contain上的count只需0.3秒。

我在response_body中存储的数据类型是原始响应体。

代码语言:javascript
复制
from .models import Response_Dataset

>>> Response_Dataset.objects.count() ## 0.1 sec
32289

>> Response_Dataset.objects.filter(response_body__icontains='hack') ## 0.4 seconds

>>> x = Response_Dataset.objects.filter(response_body__icontains='hack')
>>> x.count() ### 4 seconds
65

>>> x = Response_Dataset.objects.filter(response_body__contains='a') ### 0.2 seconds
>>> x.count() ### 0.3 seconds
23857 

与icontains一起在response_body旁边的任何其他字段上执行非常快,例如在response_title或response_status_code上

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-15 17:12:29

  1. 您需要知道Django Queryset何时真正从数据库中获得其结果。Django ORM在实际需要值之前不会访问数据库。在Django文档中对其进行了详细的描述。 在内部,可以构造、过滤、切片和传递QuerySet,而不需要实际访问数据库。在执行评估查询集的操作之前,实际上不会发生任何数据库活动。
代码语言:javascript
复制
from .models import Response_Dataset

>>> Response_Dataset.objects.count()  # ==> Database Hit
32289

>>> x = Response_Dataset.objects.filter(response_body__icontains='hack') # ==> Doesn't hit
>>> x.count() # ==> Hit
65

>>> x = Response_Dataset.objects.filter(response_body__contains='a') # ==> Doesn't hit
>>> x.count() # ==> Hit
23857 
  1. 如果某些SQL语句比较慢,则需要查看数据库中的EXPLAIN SELECT语句并适当设置索引。您可以安装Django调试工具栏,并使用调试器命令查看数据库请求的SQL。优化方法取决于您正在使用的DBMS。
  2. 在我看来,如果您想对一个非常大的数据集进行全文搜索,那么像ElasticSearch这样的搜索引擎是正确的选择。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59718659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档