2011-10-21 108 views
1

問題

我正在運行使用Workbench 5.2.35和MySQL服務器5.5的查詢,並且在600.516秒後也發生了錯誤「錯誤代碼:2013.在查詢期間丟失了與MySQL服務器的連接」在查詢中。查詢有兩個作用:MySQL,查詢太慢,如何改進?

  1. 通過具有「COL1」「VALUE1」選擇一個特定類型的特徵在於記錄(通過從階段A到B階段)
  2. 刪除記錄,其中在「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 此錯誤的原因可能是:

  1. 有人被殺查詢
  2. 網絡問題導致連接死亡
  3. 服務器崩潰/死亡
  4. 你的連接被閒置WAIT_TIMEOUT和被殺
  5. 客戶端不是爲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; 
+0

所有什麼ü從查詢想要的,它就會超時因斯它會遍歷m * n個行兩個查詢 首先,它肯定已經被時間了。更好的是,如果你簡要介紹我們的要求,以便v可以幫助.. –

+1

@SashiKant,我認爲查詢的範圍在「問題」部分有詳細描述,我想改變超時限制,只有在嚴格必要的,但我認爲問題是在查詢 –

+0

+1尼斯和明確的描述。雖然你可能只是問:我的查詢運行了600秒,我該如何讓它更快? – Johan

回答

0

我會用not in來重寫它,查詢優化器有一個特例。
另外我會用一種不同的方法將結果數量限制爲一個。

limit的問題是,它首先創建一個臨時表,其中全部結果,並從中選擇1行。

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 NOT IN 
    (SELECT col2 FROM tablename 
     WHERE col1 = 'value1' 
     AND id = t.id+1) <<--- assuming that `id` is the primary key. 

如果您對(COL1,COL2)的化合物指數和使用id作爲主鍵查詢不應該永遠走。在查詢

看,我把它改寫爲:

SELECT t.id, t.col2, t.col3, t.col4, t.col5 
FROM tablename t 
WHERE t.id IN ( 
    SELECT t2.id 
    FROM tablename t2 
    WHERE t2.col1 = 'value1' 
    GROUP BY t.col2) 

這應該做的伎倆,如果我正確研究的階段。

+0

:使用「in」或「not in」將再次終止查詢,並且超時 –

+0

@SashiKant您是否閱讀完整查詢,包括取消限制條款?海事組織這個查詢應該返回相當快。 – Johan

+0

@Johan,感謝您對NOT IN的建議,但如果您查看錶格「Stage B」和「Stage C」中id的值,最後一行「AND id = t.id + 1」將不起作用」。無論如何,我會嘗試結束我以前的查詢,我會看看它是否工作 –