問題
我正在運行使用Workbench 5.2.35和MySQL服務器5.5的查詢,並且在600.516秒後也發生了錯誤「錯誤代碼:2013.在查詢期間丟失了與MySQL服務器的連接」在查詢中。查詢有兩個作用:MySQL,查詢太慢,如何改進?
- 通過具有「COL1」「VALUE1」選擇一個特定類型的特徵在於記錄(通過從階段A到B階段)
刪除記錄,其中在「COL2的值'是相同的值‘下一結果的COL2’(通過從B階段到階段C)
Stage A Stage B Stage C *************** *************** *************** *ID *col1*col2* *ID *col1*col2* *ID *col1*col2* *************** *************** *************** *1 * A * a * *3 * C * a * *3 * C * a * *2 * B * a * *7 * C * f * *7 * C * f * *3 * C * a * *8 * C * f * *16 * C * b * *4 * S * a * *9 * C * f * *18 * C * c * *5 * B * a * *16 * C * b * *6 * A * g * *17 * C * b * *7 * C * f * *18 * C * c * *8 * C * f * *9 * C * f * *10 * A * f * *11 * B * f * *12 * D * f * *13 * S * f * *14 * F * f * *15 * F * f * *16 * C * b * *17 * C * b * *18 * C * c *
和是的概括: MySQL, select rows where a parameter value depends on the value that it has in a different row
查詢是:
SELECT t.id, t.col2, t.col3, t.col4, t.col5 FROM tablename t
WHERE t.id < 1000000
AND t.col1 = 'value1'
AND t.col2 <>
(SELECT col2 FROM tablename
WHERE col1 = 'value1'
AND id > t.id
LIMIT 1);
原因的錯誤現在
,從這個帖子 https://serverfault.com/questions/29597/what-does-mysql-error-2013-mean 此錯誤的原因可能是:
- 有人被殺查詢
- 網絡問題導致連接死亡
- 服務器崩潰/死亡
- 你的連接被閒置WAIT_TIMEOUT和被殺
- 客戶端不是爲net_wait_timeout提取數據速度不夠快被打死
但因爲查詢停在600.516秒,我猜在這種情況下,問題是數字4(超時)。
第一個想法是可能出現的問題和解決方案
增加WAIT_TIMEOUT時間,但我認爲這是由先前的錯誤觸發:查詢不返回任何東西,但繼續運行。極限t.id <百萬用於精確地測試在一個合理的有限子集查詢(數據庫中有大約200百萬個條目的) 所以,我在想,有在查詢的一些問題,特別是在在階段B和階段C之間的通道(前面的步驟是微不足道的)
任何想法的錯誤或查詢將不勝感激。
感謝
解決方案
這是工作的代碼,通過最佳答案的啓發。命令DISTINCT正常工作,但最後我使用了GROUP BY和ORDER BY以更好地呈現結果。
SELECT id, col1, col2, ..., coln FROM tablename
WHERE col1 = 'value1'
AND col2 = 'value2'
...
AND coln = 'valuen'
GROUP BY col2
ORDER BY id;
所有什麼ü從查詢想要的,它就會超時因斯它會遍歷m * n個行兩個查詢 首先,它肯定已經被時間了。更好的是,如果你簡要介紹我們的要求,以便v可以幫助.. –
@SashiKant,我認爲查詢的範圍在「問題」部分有詳細描述,我想改變超時限制,只有在嚴格必要的,但我認爲問題是在查詢 –
+1尼斯和明確的描述。雖然你可能只是問:我的查詢運行了600秒,我該如何讓它更快? – Johan