Django-Q Object比执行单独的查询要慢得多

时间:2018-12-10 06:25:38

标签: sql django database indexing

我有以下模型:

class Address(models.Model):
    full_address = models.CharField(max_length=80, db_index=True)
    alternative_address = models.CharField(max_length=80, db_index=True)

我正在查询一个特定的地址,该地址可以匹配full_addressalternative_address。显而易见的解决方案是使用Q对象。但是由于某种原因,使用Q对象会使查询变慢。

address = '123 Main Street'

# This query using Q object takes 500ms (10x slower)
addresses = Address.objects.filter(Q(full_address__startswith=address) | Q(alternative_address__startswith=address)).values(...)

# This solution, which returns the same results, takes just 50ms
addresses1 = Address.objects.filter(full_address__startswith=address).values(...)
addresses2 = Address.objects.filter(alternative_address__startswith=address).values(...)
addresses = addresses1 | addresses2

这应该发生吗?我认为在这种情况下使用Q对象应该更快而不是更慢,对吧?


编辑:添加了原始SQL查询

快速查询。 full_addressalternative_address花费了0.002秒

SELECT 
  "testapp_address"."street",
  "testapp_address"."city",
  "testapp_address"."la",
  "testapp_address"."lo",
  "testapp_address"."id" 
FROM "testapp_address" 
WHERE "testapp_address"."full_address"::text LIKE \'1 Bloor St%\' 
LIMIT 21 

Q对象查询。花了0.449秒。

SELECT
  "testapp_address"."street",
  "testapp_address"."city",
  "testapp_address"."la",
  "testapp_address"."lo",
  "testapp_address"."id"
FROM "testapp_address"
WHERE (
  "testapp_address"."full_address"::text LIKE \'1 Bloor St%\'
  OR "testapp_address"."alternative_address"::text LIKE \'1 Bloor St%\'
)
LIMIT 21

0 个答案:

没有答案
相关问题