2015-01-05 65 views
2

我正在執行一個或多個Q的查詢,它似乎需要很長時間。下面是一些僞代碼在Django查詢中對Q對象的性能影響

query_params = [] 
for i in range(80): #there are about 80ish Q objects being created 
    query_params.append(Q(filter_stuff)) 

然後,我還是將它們全部一起

query_params = reduce(or_, query_params) 

當我執行查詢

query = list(MyModel.objects.filter(query_params)) 

它掛在很長一段時間。我知道這是一個非常普遍的問題,如果沒有對數據結構的深入理解(這很難在這裏給出)很難給出診斷。但我只是好奇,是否存在對django查詢中的對象的固有性能影響

+1

您正在討論oring tog乙醚80條件,這將是緩慢的,不管... ...我會建議找出一種方法來查詢你想要的記錄 –

+0

@ doniyor沒有模型有幾個字段,但我試圖找到它們的特定對(即, q1 = Q(field1 = val1,field2 = val2),q2 = Q(field1 = val3,field2 = val4),等等......) – sedavidw

+1

我建議創建一個配對索引。 –

回答

1

通過減少對象的數量可以顯着縮小查詢的長度。他們都喜歡的格式:

q1 = Q(field1=field1_val1, field2=field2_val1) 
q2 = Q(filed1=field1_val2, field2=field2_val2) 
#...etc 

我結束了對它們進行分組的字段1倍的值:

q_dict = {field1_val1: [all field_2 values paired with field1_val1], ...} 

然後我q對象是這樣的:

for field1_val, field2_vals = q_dict.items(): 
    query_params.append(Q(field1=field1_val, field2__in=field2_vals)) 

這最終縮減下來我的號碼爲Q對象顯着且查詢運行速度快很多