2016-09-07 142 views
3

我有下面的代碼,在那裏我結果的循環從第一查詢中設置 表1中執行另一個查詢查詢太慢具有35K記錄,而表2具有4M嵌套SQL

db = MySQLdb.connect("localhost","root","root","test") 

cursor1 = db.cursor(MySQLdb.cursors.DictCursor) 
cursor2 = db.cursor(MySQLdb.cursors.DictCursor) 

sql = 'select * from table1 limit 2' 

cursor1.execute(sql) 
results = cursor1.fetchall() 

for row in results: 
    sql2 = 'select * from table2 where t1 = '+row['t1'] 
    cursor2.execute(sql2) 
    result2 = cursor2.fetchall() 
    for row2 in result2 
    #do something 

對於每次迭代和每個查詢,這個過程似乎在等待。我嘗試使用cProfile進行分析並獲得以下輸出之一:

ncalls tottime percall cumtime percall filename:lineno(function) 
3 21.529 7.176 21.529 7.176 connections.py:274(query) 

如何調試此問題?我對Python非常陌生。

+2

爲什麼要運行這樣的嵌套查詢?爲什麼你不能運行一個'連接'查詢? –

+0

你使用索引嗎? – Daniel

+1

請勿手動連接字符串以形成查詢。使用佔位符。 'table2'中的't1'是否被索引?如果沒有,你會執行一些sef掃描。 –

回答

-1

在Web應用程序中嵌套查詢從來就不是一個好主意。正如你發現的那樣,它會殺死性能。

嘗試使用連接table1和table2的單個查詢。然後,以編程方式跟蹤您的父數據何時更改以處理換行符或顯示更改。

+0

第一個選擇被限制爲2,所以嵌套不是那麼大的問題。 – Daniel

+0

我的假設是,2的限制是用於測試,因爲對查詢沒有任何其他限制。使用「select *」也是一個糟糕的主意。您通常不需要表中的每一列,這只是在數據庫和應用程序服務器之間來回發送更多數據。 –

-1

1)使用左連接的表1獲得從表2

2想要的結果)抓取結果,做你想要的東西。

3)*如果你沒有索引,添加它們(以防萬一)

幾點建議:對工會理論創建SQL。但是,Cursor設置爲循環。所以如果你使用for循環太多次了。它會導致你的命令顯着減速。優化是棘手的。基本上,使用內置函數將提高性能(除非一些複雜的情況)

嘗試解決基於聯合理論(Join/Merge/..)而不是某些腳本語言模式的問題,您將加快腳本的加速速度許多。

+0

它是關係代數。 –

+0

感謝分享。你是對的。 http://www.cs.cornell.edu/projects/btr/bioinformaticsschool/slides/gehrke.pdf –