共計 1444 個字符,預計需要花費 4 分鐘才能閱讀完成。
本篇內容介紹了“MySQL 基礎架構的執行流程”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
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(調用次數可能小于掃描行數) 并不是完全相同的。
“MySQL 基礎架構的執行流程”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!