[英]C# MySQL timeout issues
我正在運行查詢時遇到 MySQL 超時問題。 這是一個簡單的查詢,但即使在 MySQL 編輯器中也需要 5 分鍾左右才能完成。 我希望你們可能知道解決此超時問題的更好方法。
string processedCONString = "SERVER=localhost;" +
"DATABASE=discovery;" +
"UID=;" +
"PASSWORD=;"+
"connection timeout=500000";
MySqlConnection processCON = new MySqlConnection(processedCONString);
string mySQLCOMMAND = "update "+ siteString+"_discovery "+
"set processed = b'0' "
+"WHERE URL not in (select URL from live)";
MySqlCommand mysqlprocessCmdInsertItem = new MySqlCommand(mySQLCOMMAND, processCON);
processCON.Open();
mysqlprocessCmdInsertItem.ExecuteNonQuery();
processCON.Close();
是的,UID 和密碼在這里留空,但不在代碼中。
此外,隨着該數據庫的增長,查詢將花費越來越長的時間。
嘗試在 siteString + "_discovery " 返回的表中索引 URL 列。
更新:
另請注意,您在 where 子句和 INNER JOIN 中指定語句的順序非常重要。 您想知道您的語句何時會導致對每一行執行操作,或者是否會提前完成然后將其應用於行。 有幾條規則已經在網上有很好的記錄。 其他答案在這里提供了一些很好的建議。 此外,當我在一家大型機構工作時,我總是通過我們的 dba 運行我的 SQL 腳本,然后他們會強烈批評我並抱怨軟件開發人員如何總是破壞他的 m* ** f***數據庫。 如果你有這樣的人,他們通常會很有幫助,因為他們記住了所有這些規則,而我們沒有。
谷歌:“sql 查詢最佳實踐”,你會發現大量的信息。 這是一個鏈接,
喬納森漢森的回答是一個不錯的選擇+1。
如果這還不夠,您可以嘗試分部分處理。 假設您有一個 ID,您可以將您的代碼放在一個 cicle 中,並在每次迭代中處理 1000 個(或您認為合適的數量)項目。
我知道這個線程很古老,Mohgeroth 走在正確的軌道上,但是對於 mysql,查詢看起來像這樣......
update siteX_discovery
left join live on live.URL = siteX_discovery.URL
set processed = b'0'
where live.URL is null
當然,正如喬納森指出的那樣,您需要索引,否則無論您做什么都會很慢。
就其本身而言,索引在相當長的一段時間內就足夠了,但如果您的表變大,消除該子查詢將產生明顯的差異。
也許我到達了,但試試這個 sql ......
"UPDATE " + siteString + "_discovery as d " +
" SET d.processed = b'0' " +
" WHERE d.URL IN (SELECT URL from live where URL = d.URL) ";
與其在子查詢中評估整個 select ,不如對其進行過濾,以便在嘗試評估父語句中的 where 條件時不會返回每一行。
雖然,子查詢將為返回的每一行運行,所以我們可能應該完全刪除子查詢並讓連接來處理這個問題。 由於我們只想對我們可以在 LIVE 表中找到的 URL 執行此操作,因此加入它們應該是平展子查詢的小菜一碟……
"UPDATE d " +
" SET d.processed = b'0' " +
" FROM " + siteString + "_discovery as d " +
" JOIN live as l " +
" ON d.URL = l.URL";
此特定更新是在 SQL 服務器上測試的,而不是 MySql 但您可能需要調整事件的順序才能轉換它,我不是 100% 確定,有人可以確認嗎?
如果您對異常感到惱火,那么
mysqlprocessCmdInsertItem.CommandTimeout=1000;
可能會有所幫助(或超時的另一個大數字)。 命令超時默認為 30 秒(僅花費在網絡讀取計數上的時間)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.