簡體   English   中英

C# MySQL 超時問題

[英]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 查詢最佳實踐”,你會發現大量的信息。 這是一個鏈接,

http://blog.sqlauthority.com/2009/01/20/sql-server-rules-for-optimizining-any-query-best-practices-for-query-optimization/

喬納森漢森的回答是一個不錯的選擇+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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM