2012-01-02 93 views
12

我有我的當前數據庫與MySQL的問題。無法更新記錄,卡住

我有超過100個連接在選擇記錄上等待。當我執行時:

show processlist; 

選擇查詢是一個大的查詢,其他人是小問題和插入,更新。

我有一個數據庫有100個表,選擇使用5個連接。

有沒有辦法暫時停止進程並讓其他進程運行,一旦所有進程完成,那麼select可以繼續運行?

+1

解釋你的查詢,也許你有索引問題 – 2012-01-02 00:40:12

+0

例如,一個INSERT如何等待SELECT?我不想相信任何配置好的現代SQL服務器都會出現這個bug ... – 2012-01-02 00:53:31

+1

@PéterVarga:在MyISAM中,讀取操作可以阻止寫入操作(反之亦然)。 – Quassnoi 2012-01-02 00:55:14

回答

12

我會建議讓查詢做它需要做的事情,如果您停止任何操作或終止進程或查詢,則可能會導致數據完整性錯誤,從而導致嚴重錯誤。

BookOfZeus和tfb785是正確的,首先你可能有索引錯誤。解釋會告訴你究竟是什麼問題以及要尋找什麼。例如,如果你有5個連接,並且你得到的行數如100,000和100,1和1和1,那麼你將會有超過100,000 * 100的超級慢。

仔細閱讀解釋告訴你什麼,並根據它優化你的查詢。

如果您經常訪問表,innodb可能是一個不錯的選擇,因爲它的行鎖定對myisam的表鎖定進行了檢查。

我會說首先嚐試優化您的查詢,也許你不會需要改變你的表引擎來解決問題。如果你仍然有問題,那麼你可能會考慮轉向innodb。

+0

讓我檢查我有什麼 – 2012-01-11 00:51:56

+0

哦f ** k你是對的我有:1,314,145在1桌上, 1,292在第二張桌子上,11在第三張桌子上,其餘的都是1.所以這意味着1,314,145 * 1292 * 11 * 1 * 1? – 2012-01-11 00:55:46

+0

這是你的問題,確保索引是好的,鑰匙是(PK,鑰匙和fk)都設置正確 – 2012-01-11 00:57:29

4

是否有辦法臨時停止進程並讓其他進程運行,一旦所有進程都完成,那麼select可以繼續運行?

我相信你正在使用MyISAM作爲存儲引擎。

MyISAM中,讀取查詢會阻止併發寫入查詢。這可以確保寫入操作不會更改正在處理的數據,並且不會更新記錄集的一半,而另一半不會更新。

沒有辦法停止SELECT查詢的方式你問:寫入可能會使記錄集返回不一致。雖然它可能不是您的設置中的實際情況,理論上寫入可能不會影響讀取(例如,讀取和寫入不同的記錄),但MyISAM不知道,並且始終會阻止整個表,以防萬一。

如果您不需要寫入塊讀取,請切換至InnoDB(儘管有些情況下寫入也會阻止讀取操作)。

4

您無法停止正在運行的查詢並將時間留給其他查詢。但是,有三種方法來解決問題:

第一種方式: 更改隔離級別http://dev.mysql.com/doc/refman/5.6/en/mysql-acid.html 這也意味着你必須改變你的存儲引擎如。到InnoDB。

第二種方式: 嘗試加快您的長時間運行選擇帶指數的。這是所謂的時間記憶折衷。你用更多的內存加速你的查詢來保存索引樹。

第三種方式: 加快您的長時間運行選擇重新排列查詢(連接和選擇)。分析所有查詢部分的成本。