此更改如何影响此数据库查询的速度?

时间:2010-07-20 19:16:29

标签: mysql database django optimization

首先我使用了这个请求:

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

但后来我需要扩展我的查询并将其更改为:

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

突然间,我的数据库比原始查询长5倍。这里发生了什么,我怎样才能让它更快?

2 个答案:

答案 0 :(得分:2)

不区分大小写的通配符搜索(name__icontains='something')绝对是一个比区分大小写的完全匹配(name='something')更昂贵的数据库查询。慢5倍听起来不合理,并且会根据以下任何一项而有很大差异:

  • 数据库引擎(MySQL,PostgreSQL,SQLite等)
  • 数据库中的记录数
  • 每个名称字段中必须搜索的文本量
  • 数据库是否可以使用该列的适当索引

最后一个非常棘手。对数据库进行全文索引很难做到,很容易出错,甚至连所有数据库引擎都不支持。

datedate__range的情况相同:您在一个中使用快速,简单,易于索引的完全匹配,而在另一个中使用不精确的匹配。

底线:如果您不需要不精确的匹配,那么请不要使用它们。它们是昂贵的数据库操作,并且需要更长的时间。

答案 1 :(得分:0)

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

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

并检查,发出了什么样的SQL查询以及他们花了多少时间。

相关问题