首先我使用了这个请求:
Model.object.get(name='something', date=somedatavariable)
但后来我需要扩展我的查询并将其更改为:
Model.objects.get(name__icontains="something", date__range(start_date,end_date))
突然间,我的数据库比原始查询长5倍。这里发生了什么,我怎样才能让它更快?
答案 0 :(得分:2)
不区分大小写的通配符搜索(name__icontains='something'
)绝对是一个比区分大小写的完全匹配(name='something'
)更昂贵的数据库查询。慢5倍听起来不合理,并且会根据以下任何一项而有很大差异:
最后一个非常棘手。对数据库进行全文索引很难做到,很容易出错,甚至连所有数据库引擎都不支持。
date
与date__range
的情况相同:您在一个中使用快速,简单,易于索引的完全匹配,而在另一个中使用不精确的匹配。
底线:如果您不需要不精确的匹配,那么请不要使用它们。它们是昂贵的数据库操作,并且需要更长的时间。
答案 1 :(得分:0)
我怀疑是否有人可以猜到,你的数据库表现如何:-)但你可以使用这个中间件:
http://djangosnippets.org/snippets/161/
并检查,发出了什么样的SQL查询以及他们花了多少时间。