2012-04-27 60 views
120

是什麼意思,如果MySQL查詢:當MySQL處於「發送數據」狀態時,這意味着什麼?

SHOW PROCESSLIST; 

回報狀態列中的「發送數據」?

我想這意味着查詢已被執行,並且MySQL正在向客戶端發送「結果」數據,但我想知道爲什麼需要這麼多時間(長達一個小時)。

謝謝。

+1

這意味着它將數據從其進程傳輸到客戶端。如果您在運行「SHOW PROFILE」之後看到'發送數據'作爲一個需要花費時間的步驟,那麼實際上消耗的時間就屬於之前的步驟。 – 2012-04-27 08:24:49

+0

不幸的是,我收到一條消息,'SHOW PROFILE'功能被禁用,我必須使用'enable-profiling'構建MySQL。但是感謝您的回覆。 – user1345414 2012-04-27 08:38:49

+0

這是另外一個問題。查詢已在內部完成,是否像網絡或總線一樣傳輸資源? – user1345414 2012-04-27 08:45:58

回答

182

這是一個相當令人誤解的狀態。它應該被稱爲「讀取和過濾數據」。

這意味着MySQL有一些數據存儲在磁盤(或內存)中,這些數據還有待讀取和發送。它可以是表本身,索引,臨時表,排序輸出等。

如果你有一個1M記錄表(沒有索引),你只需要一條記錄,MySQL仍然會輸出狀態爲掃描表時發送「發送數據」,儘管它尚未發送任何內容。

+10

這個文檔進一步解釋了這個推理很可能是因爲有很多時間在做磁盤訪問:http://dev.mysql.com/doc/refman/5.0/en/general-thread-states.html – 2013-07-30 22:06:09

+1

如果MySQL在使用99%CPU時「發送數據」,而磁盤I/O很少? – rustyx 2017-04-19 20:25:40

+0

@RustyX如何處理已存在於RAM中的緩衝區中的數據,並正在排序一些100k或1M的行? – sjas 2017-06-22 15:53:51

14

在此狀態下:

線程是的 SELECT語句讀取和處理行,並且將數據發送到客戶端。

因爲在此狀態期間發生的操作往往會執行 大量磁盤訪問(讀取)

這就是爲什麼它需要更多的時間來完成,所以是在給定的查詢的壽命運行時間最長的狀態

相關問題