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中存储的数据类型是原始响应体。
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上
发布于 2020-01-15 17:12:29
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 EXPLAIN SELECT语句并适当设置索引。您可以安装Django调试工具栏,并使用调试器命令查看数据库请求的SQL。优化方法取决于您正在使用的DBMS。https://stackoverflow.com/questions/59718659
复制相似问题