MySQL processlist中哪些狀態(tài)要引起關(guān)注

2018-07-31 19:01 更新

一般而言,我們?cè)趐rocesslist結(jié)果中如果經(jīng)常能看到某些SQL的話,至少可以說明這些SQL的頻率很高,通常需要對(duì)這些SQL進(jìn)行進(jìn)一步優(yōu)化。

今天我們要說的是,在processlist中,看到哪些運(yùn)行狀態(tài)時(shí)要引起關(guān)注,主要有下面幾個(gè):

狀態(tài) 建議
copy to tmp table 執(zhí)行ALTER TABLE修改表結(jié)構(gòu)時(shí)建議:放在凌晨執(zhí)行或者采用類似pt-osc工具
Copying to tmp table 拷貝數(shù)據(jù)到內(nèi)存中的臨時(shí)表,常見于GROUP BY操作時(shí)建議:創(chuàng)建適當(dāng)?shù)乃饕?/td>
Copying to tmp table on disk 臨時(shí)結(jié)果集太大,內(nèi)存中放不下,需要將內(nèi)存中的臨時(shí)表拷貝到磁盤上,形成 #sql***.MYD、#sql***.MYI(在5.6及更高的版本,臨時(shí)表可以改成InnoDB引擎了,可以參考選項(xiàng)default_tmp_storage_engine)建議:創(chuàng)建適當(dāng)?shù)乃饕?,并且適當(dāng)加大sort_buffer_size/tmp_table_size/max_heap_table_size
Creating sort index 當(dāng)前的SELECT中需要用到臨時(shí)表在進(jìn)行ORDER BY排序建議:創(chuàng)建適當(dāng)?shù)乃饕?/td>
Creating tmp table 創(chuàng)建基于內(nèi)存或磁盤的臨時(shí)表,當(dāng)從內(nèi)存轉(zhuǎn)成磁盤的臨時(shí)表時(shí),狀態(tài)會(huì)變成:Copying to tmp table on disk建議:創(chuàng)建適當(dāng)?shù)乃饕蛘呱儆肬NION、視圖(VIEW)、子查詢(SUBQUERY)之類的,確實(shí)需要用到臨時(shí)表的時(shí)候,可以在session級(jí)臨時(shí)適當(dāng)調(diào)大 tmp_table_size/max_heap_table_size 的值
Reading from net 表示server端正通過網(wǎng)絡(luò)讀取客戶端發(fā)送過來的請(qǐng)求建議:減小客戶端發(fā)送數(shù)據(jù)包大小,提高網(wǎng)絡(luò)帶寬/質(zhì)量
Sending data 從server端發(fā)送數(shù)據(jù)到客戶端,也有可能是接收存儲(chǔ)引擎層返回的數(shù)據(jù),再發(fā)送給客戶端,數(shù)據(jù)量很大時(shí)尤其經(jīng)常能看見備注:Sending Data不是網(wǎng)絡(luò)發(fā)送,是從硬盤讀取,發(fā)送到網(wǎng)絡(luò)是Writing to net(建議:通過索引或加上LIMIT,減少需要掃描并且發(fā)送給客戶端的數(shù)據(jù)量)
Sorting result 正在對(duì)結(jié)果進(jìn)行排序,類似Creating sort index,不過是正常表,而不是在內(nèi)存表中進(jìn)行排序建議:創(chuàng)建適當(dāng)?shù)乃饕?/td>
statistics 進(jìn)行數(shù)據(jù)統(tǒng)計(jì)以便解析執(zhí)行計(jì)劃,如果狀態(tài)比較經(jīng)常出現(xiàn),有可能是磁盤IO性能很差建議:查看當(dāng)前io性能狀態(tài),例如iowait
Waiting for global read lock FLUSH TABLES WITH READ LOCK整等待全局讀鎖建議:不要對(duì)線上業(yè)務(wù)數(shù)據(jù)庫加上全局讀鎖,通常是備份引起,可以放在業(yè)務(wù)低谷期間執(zhí)行或者放在slave服務(wù)器上執(zhí)行備份
Waiting for tables,Waiting for table flush FLUSH TABLES, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE等需要刷新表結(jié)構(gòu)并重新打開建議:不要對(duì)線上業(yè)務(wù)數(shù)據(jù)庫執(zhí)行這些操作,可以放在業(yè)務(wù)低谷期間執(zhí)行
Waiting for lock_type lock 等待各種類型的鎖:? Waiting for event metadata lock? Waiting for global read lock ? Waiting for schema metadata lock? Waiting for stored function metadata lock? Waiting for stored procedure metadata lock? Waiting for table level lock? Waiting for table metadata lock? Waiting for trigger metadata lock建議:比較常見的是上面提到的global read lock以及table metadata lock,建議不要對(duì)線上業(yè)務(wù)數(shù)據(jù)庫執(zhí)行這些操作,可以放在業(yè)務(wù)低谷期間執(zhí)行。如果是table level lock,通常是因?yàn)檫€在使用MyISAM引擎表,趕緊轉(zhuǎn)投InnoDB引擎吧,別再老頑固了

更多詳情可參考官方手冊(cè):8.14.2 General Thread States

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)