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