2013-04-17 46 views
0

我的腳本需要通過大量的行運行,分析的內容,然後再對它們進行更新(選擇性)只是想確認是否通過運行一個MySQL的更新超過多個查詢

很顯然,我有一個循環更快以評估每一行...

我通常會在此循環內發出一個SQL UPDATE查詢(對於當前正在評估的行)... Infact我更喜歡這個更好,更清潔的代碼等。 $ q =「UPDATE mytable SET status ='online'WHERE id = '22'」;

但最近我一直在使用「IN」的條款被..循環會聚集在CSV的ID,再後來做的;

if ids exist do query 
    $q = "UPDATE mytable SET status='online' WHERE id IN(22,25,147)"; 

所以是2種技術之一顯着更好?事實上?也可能我也堅持瓦特/ IM哪裏舒服...

沒錯,代碼和其他任務我必須做的,它更容易有循環內的單獨的更新SQLS火...

+0

'IN'通常是朝着這個較慢的方法,但是你可以運行一個基準,計算它需要雙方的時間,你的情況,並據此作出決定 –

+0

您可以分析您的查詢,可以看到它需要執行的時間。通常,更新語句運行得更快,但考慮到多個更新語句,它將花費大量的數據庫資源和時間來執行。所以在這種情況下,IN應該給你更多的表現。的 – ankurtr

+0

可能重複[MySQL或VS在性能(http://stackoverflow.com/questions/782915/mysql-or-vs-in-performance) – Matt

回答

2

IN (<multiple id's>)的單個查詢應該比具有一個id的多個查詢更好。這是因爲服務器必須解析您的SQL語句並創建查詢計劃,而解析的成本通常與實際執行時間相當。使用100個ID分析一個語句的花費大約與使用一個ID相同。

然而,如果收集到的項目數超過100,更好的方法是創建另一個表將包含這些ID的。如果此表的索引號爲id,那麼它對性能而言是理想的。

+0

感謝,但如何更好地爲這個問題了。對我來說,通過麻煩顯然更好? 以及爲什麼你會建議超過100的臨時表? IN子句「應變」系統在100左右後?那麼循環更新會更好嗎? 是的id是索引/主。 – BrownChiLD

+0

如果您不斷地將ID添加到您的SQL語句中,它會變得越來越大,即使沒有考慮SQL開銷,客戶端也會越來越慢。此外,如果您的語句增長超過1MB(默認緩衝區限制),您將**必須切換到表格。如果您有100個ID,您可能希望能夠在過程中斷時重啓您的過程。如果您將ID保留在表中,這很容易。但是,如果你把它留在記憶中,不要太多。 – mvp

+0

以及我的腳本可以從記錄..隨時隨地5000之間1被處理定期(每3秒左右)..這是有點像在Java/AJAX間隔引發了現場半實時事情..反正我仍然不能在比較單獨的查詢循環中進行比較,那麼會變得更穩定/更好呢?因爲每個查詢都是啓動和關閉的(而不是緩存到數百個ids,mysql必須保留在內存中)。是它是如何工作的? ..我使用INNODB和mysql交易無論如何我不擔心它會中斷,簡單地完成或不 – BrownChiLD

相關問題