一、背景介绍
有两个查询条件差不多的函数,查询条件都是通过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作查询条件时,要慎用,用错了会有较大的性能开销。
造成这种原因的原理目前还没有时间去分析,如果有大神知道的话,请指导。