2012-04-21 71 views
4

基本上我需要在大數據集上操作,所以我開始考慮我可以使用mysql_unbuffered_query來不加載RAM中的所有結果。大數據集:mysql_unbuffered_query與innodb?

但我讀到,雖然我正在提取行,我不能在同一張桌子上運行任何其他查詢。我想知道如果桌子是innodb,這仍然是真的嗎?

Innodb在執行mysql_unbuffered_query時使用行級鎖定嗎?

僞代碼:

$q = mysql_unbuffered_query("SELECT * FROM largeTable"); 
while($r = fetch($q)) { 
if (some condition) 
    mysql_query("UPDATE largeTable SET field = somevalue WHERE id = someid"); 
} 

回答

1

,你不能運行其他查詢的原因是查詢的結果不預取,你正在處理一個光標。不過,您可以打開另一個連接來處理其他查詢。

請記住,MySQL中有幾個設置會影響連接在查詢執行後保持打開狀態的時間,如果數據集很大,服務器可以在處理查詢之前關閉連接(見WAIT_TIMEOUT和net_write_timeout)

良好的替代方法是在一個循環中執行查詢,限制的行數,以及使用WHERE pk > value ORDER BY pk ASC,其中pk是主鍵,和value從先前查詢檢索(如如果最後一個值你實現的只是極限,偏移性能會隨着大偏移量而降低)