我有以下模型:
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_address
或alternative_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_address
和alternative_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