在一个类的管理器中,我有下面的方法来只选择某些示例中需要的对象。
def active(self):
query = Q(
Q(is_active=True, care_over_65=True, is_provider=False)
& Q(
Q(service_care_home=True)
| Q(service_home_care=True)
| Q(service_live_in_care=True)
)
) | Q(is_active=True, service_retirement_village=True, is_provider=False)
return self.get_queryset().filter(query)
是否可以在模型中为此编写一个索引来提高性能?目前,我已经分别指定了这些字段(作为单独的索引),并将它们全部作为一个索引
models.Index(
fields=[
'is_active', 'care_over_65', "is_provider",'service_care_home','service_home_care','service_live_in_care', '-is_premium', 'name'
]
),
但这似乎对性能没有影响。
它运行在MySQL8上
1条答案
按热度按时间erhoui1w1#
一般来说,索引的工作方式不支持OR,因为索引的思想是从左列到右列查找匹配的行。因此,建议将此类查询替换为UNIION查询,以便独立评估每个查询,并在将结果返回给客户端之前聚合结果。
示例
而不是写作
应写成
这需要两个索引,一个在colA上,另一个在colB上
P.S. Django不支持此功能,需要手动管理。