如何为OR查询创建Django模型索引

vsaztqbk  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(158)

在一个类的管理器中,我有下面的方法来只选择某些示例中需要的对象。

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上

erhoui1w

erhoui1w1#

一般来说,索引的工作方式支持OR,因为索引的思想是从左列到右列查找匹配的行。因此,建议将此类查询替换为UNIION查询,以便独立评估每个查询,并在将结果返回给客户端之前聚合结果。
示例
而不是写作

select * from Table where colA='A' or ColB='X'

应写成

select * from Table where colA='A' UNION select * from Table ColB='X'

这需要两个索引,一个在colA上,另一个在colB上
P.S. Django不支持此功能,需要手动管理。

相关问题