MySQL基礎架構執行流程

chenfeng發表於2018-12-12

MySQL的架構大體分為兩層:Server 層和儲存引擎層


server層: 聯結器,查詢快取,分析器,最佳化器等,涵蓋MySQL的大多數核心服務功能,一級所有內建函式(如日期,時間,數學和加密函式等),所有誇儲存引起的功能都在這一層實現,比如:存過,觸發器,檢視等。


儲存引擎負責資料的儲存和提取:innoDB,MyISAM,Memory等 MySql5.5.5版本開始預設為InnoDB


各層次分工:


1.聯結器:顧名思義聯結器負責跟客戶端建立連線、獲取許可權、維持和管理連線


你可以在 show processlist 命令中看到它。Command列顯示為Sleep則表示該連線為空閒連結。


2.查詢快取:連線建立完成後,你就可以執行 select 語句了。執行邏輯第二步查詢快取。


優勢:提高查詢效率,適合表資料不經常做更新的。


劣勢:一張表有更新機會清空快取,命中率會很低。


使用引數 query_cache_type 設定成 DEMAND這樣對應預設的SQL語句是不適用查詢快取的,顯示指定的時候才會查詢快取如下:


select SQL_CACHE * FROM T WHERE ID = 10;


3.分析器:如果沒有命中快取則開始對SQL語句進行解析,生成解析樹。


4.經過了分析器,MySQL 就知道你要做什麼了。在開始執行之前得經過最佳化器的處理,包括表裡有多個索引時決定使用哪個索引;一個語句有多表關聯的時候決定各個表的連線順序;

例如:

mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;


既可以先從表 t1 裡面取出 c=10 的記錄的 ID 值,再根據 ID 值關聯到表 t2,再判斷 t2 裡面 d 的值是否等於20。


也可以先從表 t2 裡面取出 d=20 的記錄的 ID 值,再根據 ID 值關聯到 t1,再判斷 t1 裡面 c 的值是是否等於 10。


後邊仔細分析對索引的選擇


5. 執行器:MySql透過分析器知道了你要做什麼,透過最佳化器知道了該怎麼做,於是就進入了之情器階段開始執行語句。


如以下語句的執行過程:

mysql> select * from T where ID=10;


1).執行器會根據表定義的引擎取呼叫這個引擎所提供的介面。比如我們例句中提供的表T,ID無索引則會:


呼叫InnoDB引擎介面取這個表的第一行,判斷ID是否為10,如果不是則跳過,如果是則將這行存在結果集中;


2).呼叫引擎介面取“下一行”,重複相同的判斷邏輯,指導取到這個表的最後一行。


3).執行器將上述遍歷過程中所有滿足的條件行組成記錄集作為結果返回給客戶端。


至此這個語句執行就完成了。


對於有索引的表,執行的邏輯也差不多。第一次呼叫的是**“滿足條件得第一行“這個介面,之後迴圈取“滿足條件的下一行”這個介面。** 這些介面都是儲存殷勤中定義好的。


** rows_examined **:表示語句掃描了多少行,這個值就是執行器每次呼叫引擎獲取資料行時累加的。


在某些場景下,執行器呼叫一次,在引擎內部則掃描了多行,因此引擎掃描行數跟rows_examined(呼叫次數可能小於掃描行數)並不是完全相同的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2284996/,如需轉載,請註明出處,否則將追究法律責任。

相關文章