2010-07-20 44 views
1

首先,我用这个请求:此更改如何影响此数据库查询的速度?

Model.object.get(name='something', date=somedatavariable) 

但后来我需要延长我的查询,并更改为这样:

Model.objects.get(name__icontains="something", date__range(start_date,end_date)) 

突然我的数据库需要比原始查询的5倍。这里发生了什么,以及如何让它更快?

回答

2

不区分大小写的通配符搜索(name__icontains='something')肯定会比区分大小写的精确匹配(name='something')更昂贵的DB查询。较慢的5倍不健全,不合理,而且会有所不同很大程度上依赖于任何和所有的以下内容:

  • 数据库引擎(MySQL和PostgreSQL,SQLite的,等)
  • 在DB的记录数
  • 卷,它具有通过
  • 搜索无论是否有一个适当的索引数据库可以使用该列

最后一个有非常棘手的每一个名字字段中的文本。为数据库做全文索引是非常困难的,很容易出错,甚至没有被所有的数据库引擎支持。

datedate__range相同:您正在使用一个快速,简单,易于索引的精确匹配,另一个使用了不精确的匹配。

底线:如果你不需要不完全匹配,那就不要使用它们。他们昂贵的数据库操作,将花费更长的时间。

+0

也许我可以以某种方式重新配置MySQL数据库。我不喜欢它的工作方式。我想很长时间。但在任务管理器中,它显示MySQL仅使用25 MB。我可以为MsSQL扩展我的内存吗? – Pol 2010-07-20 21:24:59

+0

这不是内存问题。 MySQL的内存管理很好。您需要了解更多关于数据库索引和排序规则如何工作的信息。或者为了快速“我不想理解,只是给我一个解决方案...”然后我推荐这个谷歌搜索:http://www.google.com/search?q=django+mysql+full-text +索引 – 2010-07-20 21:37:31

+0

不!我想明白。给我一些好的文档 – Pol 2010-07-21 00:04:20

0

我怀疑任何人都可以猜到,你的数据库究竟如何表现:-)但你可以使用这个中间件:

http://djangosnippets.org/snippets/161/

和检查,作了什么样的SQL查询和多少时间,他们拿。

+0

确切地了解查询花了多长时间是一件好事,虽然说实话我更喜欢在单元测试中进行这种分析,我可以分离变量。然而,这些查询看起来相当简单,OP的放缓的根源非常明显。 – 2010-07-20 21:22:41