查詢執行的基礎

一、執行一個查詢的過程

1、客戶端發送一條查詢給服務器

2、服務器先檢查查詢緩存,如果命中了緩存,則立刻返回存儲在緩存中的結果。否則進入下一階段

3、服務器端進行sql解析、預處理,再由存儲引擎層提供的統計信息並使用服務器層的CBO優化器(mysql並不是任何時候都是喲紅基於成本的CBO優化器,有時候也會使用基於規則的RBO優化器)生成對應的執行計劃。

4、MySQL根據優化器生成的執行計劃,調用存儲引擎的API來執行查詢。

5、將結果返回給客戶端。

二、查詢mysql服務器的狀態:

show full processlist ;

Sleep:線程正在等待客戶端發送新的請求

Query:線程正在執行查詢或者正在將結果發送給客戶端

Locked:在MySQL服務器層,改線程正在等待表鎖。在存儲引擎級別實現的鎖,例如InnoDB的行鎖,並不會體現在線程狀態中,對於MyISAM來說這是一個比較典型的狀態,但在其他沒有行鎖的引擎中也經常會出現。

Analyzing and statistics:線程正在收集存儲引擎的統計信息,並生成查詢的執行計劃。

copying to tmp table [on disk]:線程正在執行查詢,並且將結果集都複製到一個臨時表中,這種狀態一般要麼是在做GROUP by 操作,要麼是文件排序操作,或者是union操作。如果這個狀態後面還有“on disk“ 標記,那表示MySQL正在講一個內存臨時表放在磁盤上。

Sorting result:線程正在對結果集排序

Sending data:這表示多種情況:線程刻能在多個狀態之間傳送數據,或者在生成結果集,或者向客戶端返回數據。


分享到:


相關文章: