一般而言,我們在processlist結(jié)果中如果經(jīng)常能看到某些SQL的話,至少可以說明這些SQL的頻率很高,通常需要對這些SQL進行進一步優(yōu)化。
今天我們要說的是,在processlist中,看到哪些運行狀態(tài)時要引起關(guān)注,主要有下面幾個:
狀態(tài) | 建議 |
---|---|
copy to tmp table | 執(zhí)行ALTER TABLE修改表結(jié)構(gòu)時建議:放在凌晨執(zhí)行或者采用類似pt-osc工具 |
Copying to tmp table | 拷貝數(shù)據(jù)到內(nèi)存中的臨時表,常見于GROUP BY操作時建議:創(chuàng)建適當?shù)乃饕?/td> |
Copying to tmp table on disk | 臨時結(jié)果集太大,內(nèi)存中放不下,需要將內(nèi)存中的臨時表拷貝到磁盤上,形成 #sql***.MYD 、#sql***.MYI (在5.6及更高的版本,臨時表可以改成InnoDB引擎了,可以參考選項default_tmp_storage_engine)建議:創(chuàng)建適當?shù)乃饕?,并且適當加大sort_buffer_size/tmp_table_size/max_heap_table_size |
Creating sort index | 當前的SELECT中需要用到臨時表在進行ORDER BY排序建議:創(chuàng)建適當?shù)乃饕?/td> |
Creating tmp table | 創(chuàng)建基于內(nèi)存或磁盤的臨時表,當從內(nèi)存轉(zhuǎn)成磁盤的臨時表時,狀態(tài)會變成:Copying to tmp table on disk建議:創(chuàng)建適當?shù)乃饕?,或者少用UNION、視圖(VIEW)、子查詢(SUBQUERY)之類的,確實需要用到臨時表的時候,可以在session級臨時適當調(diào)大 tmp_table_size/max_heap_table_size 的值 |
Reading from net | 表示server端正通過網(wǎng)絡(luò)讀取客戶端發(fā)送過來的請求建議:減小客戶端發(fā)送數(shù)據(jù)包大小,提高網(wǎng)絡(luò)帶寬/質(zhì)量 |
Sending data | 從server端發(fā)送數(shù)據(jù)到客戶端,也有可能是接收存儲引擎層返回的數(shù)據(jù),再發(fā)送給客戶端,數(shù)據(jù)量很大時尤其經(jīng)常能看見備注:Sending Data不是網(wǎng)絡(luò)發(fā)送,是從硬盤讀取,發(fā)送到網(wǎng)絡(luò)是Writing to net(建議:通過索引或加上LIMIT,減少需要掃描并且發(fā)送給客戶端的數(shù)據(jù)量) |
Sorting result | 正在對結(jié)果進行排序,類似Creating sort index,不過是正常表,而不是在內(nèi)存表中進行排序建議:創(chuàng)建適當?shù)乃饕?/td> |
statistics | 進行數(shù)據(jù)統(tǒng)計以便解析執(zhí)行計劃,如果狀態(tài)比較經(jīng)常出現(xiàn),有可能是磁盤IO性能很差建議:查看當前io性能狀態(tài),例如iowait |
Waiting for global read lock | FLUSH TABLES WITH READ LOCK整等待全局讀鎖建議:不要對線上業(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)并重新打開建議:不要對線上業(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,建議不要對線上業(yè)務(wù)數(shù)據(jù)庫執(zhí)行這些操作,可以放在業(yè)務(wù)低谷期間執(zhí)行。如果是table level lock,通常是因為還在使用MyISAM引擎表,趕緊轉(zhuǎn)投InnoDB引擎吧,別再老頑固了 |
更多詳情可參考官方手冊:8.14.2 General Thread States
更多建議: