首先,我用这个请求:此更改如何影响此数据库查询的速度?
Model.object.get(name='something', date=somedatavariable)
但后来我需要延长我的查询,并更改为这样:
Model.objects.get(name__icontains="something", date__range(start_date,end_date))
突然我的数据库需要比原始查询的5倍。这里发生了什么,以及如何让它更快?
首先,我用这个请求:此更改如何影响此数据库查询的速度?
Model.object.get(name='something', date=somedatavariable)
但后来我需要延长我的查询,并更改为这样:
Model.objects.get(name__icontains="something", date__range(start_date,end_date))
突然我的数据库需要比原始查询的5倍。这里发生了什么,以及如何让它更快?
不区分大小写的通配符搜索(name__icontains='something'
)肯定会比区分大小写的精确匹配(name='something'
)更昂贵的DB查询。较慢的5倍不健全,不合理,而且会有所不同很大程度上依赖于任何和所有的以下内容:
最后一个有非常棘手的每一个名字字段中的文本。为数据库做全文索引是非常困难的,很容易出错,甚至没有被所有的数据库引擎支持。
date
与date__range
相同:您正在使用一个快速,简单,易于索引的精确匹配,另一个使用了不精确的匹配。
底线:如果你不需要不完全匹配,那就不要使用它们。他们昂贵的数据库操作,将花费更长的时间。
我怀疑任何人都可以猜到,你的数据库究竟如何表现:-)但你可以使用这个中间件:
http://djangosnippets.org/snippets/161/
和检查,作了什么样的SQL查询和多少时间,他们拿。
确切地了解查询花了多长时间是一件好事,虽然说实话我更喜欢在单元测试中进行这种分析,我可以分离变量。然而,这些查询看起来相当简单,OP的放缓的根源非常明显。 – 2010-07-20 21:22:41
也许我可以以某种方式重新配置MySQL数据库。我不喜欢它的工作方式。我想很长时间。但在任务管理器中,它显示MySQL仅使用25 MB。我可以为MsSQL扩展我的内存吗? – Pol 2010-07-20 21:24:59
这不是内存问题。 MySQL的内存管理很好。您需要了解更多关于数据库索引和排序规则如何工作的信息。或者为了快速“我不想理解,只是给我一个解决方案...”然后我推荐这个谷歌搜索:http://www.google.com/search?q=django+mysql+full-text +索引 – 2010-07-20 21:37:31
不!我想明白。给我一些好的文档 – Pol 2010-07-21 00:04:20