【性能优化】Django ORM使用Q查询时注意事项

一、背景介绍

有两个查询条件差不多的函数,查询条件都是通过Q拼接而来,但是两者的查询时间差别很大。
一个耗时1.044s(DEBUG (1.044))一个耗时0.040s(DEBUG (0.040)

二、分析

代码如下(脱密代码段)
条件1:

    # 拼接查询条件
    filter_list = Q(id=1)
    for key, time in demo_list:
        filter_list = filter_list | Q(xxx_key=key, xxx_time=time)

条件2:

    # 拼接查询条件
    filter_list = Q()
    for key, time in demo_list:
        filter_list = filter_list | Q(xxx_key=key, xxx_time=time)

从上面的查询条件代码我们可以看出,查询条件中,唯一的区别是条件一中多了Q(id=1),而且数据库中没有id=1的数据。

通过实验,去掉Q(id=1),条件一的查询时间也变的和条件2差不多。

通过实验,如果查询条件变成Q()或者Q(id=-1),查询时间变成4s以上。

三、总结

上上面的分析,我们可以看出,在使用Q作查询条件时,要慎用,用错了会有较大的性能开销。

造成这种原因的原理目前还没有时间去分析,如果有大神知道的话,请指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值