一條SQL查詢語句是如何執(zhí)行的? MySql雜談
在碼農的世界里,優(yōu)美的應用體驗,來源于程序員對細節(jié)的處理以及自我要求的境界,年輕人也是忙忙碌碌的碼農中一員,每天、每周,都會留下一些腳印,就是這些創(chuàng)作的內容,有一種執(zhí)著,就是不知為什么,如果你迷茫,不妨來瞅瞅碼農的軌跡。

如下所示,一條普通的查詢語句,你看到的是無數的用戶列表信息展示出來
當你點擊執(zhí)行這條查詢指令時,你知道發(fā)生了什么嗎 ???
1 第一步 建立連接
第一步,你的客戶端會先連接到這個數據庫上,這時候對接的就是連接器,連接器負責跟客戶端建立連接、獲取權限、維持和管理連接。
然后連接器根據你提供的用戶名與密碼信息進行校驗而創(chuàng)建連接
2 第二步 經典查詢緩存
連接建立完成后,第二步就是查詢緩存。
當mysql拿到這個查詢后,會先到查詢緩存檢查查看之前是不是執(zhí)行過這條語句,如果執(zhí)行過,那么會將查詢語句及其結果以 key-value 對的形式緩存在內存中(key 是查詢的 語句,value 是查詢的結果),查詢到,就直接反回結果給客戶端
之所以稱之為經典查詢緩存,是因為MySQL 8.0 版本直接將查詢緩存的整塊功能刪掉了,查詢緩存往往弊大于利,查詢緩存的失效非常頻繁,只要有對一個表的更新,這個表上所有的查詢緩存都會被清空。
3 第三步 分析器 分析語法
分析器先會做“詞法分析”,分析關鍵字 如 select 、update這一類的,然后將其他字符串識別成表中的列
然后再做語法分析,結合詞法的結果來進行 語法分析, 檢查輸入的SQL 語句是否滿足 MySQL 語法
如果語法不對,就會收到“You have an error in your SQL syntax”的錯誤提醒,一般語法錯誤會提示第一個出現錯誤的位置,檢查緊接“use near”的內容部分解決就好。
4 第四步 優(yōu)化器
分析器校驗SQL語法后,MySql就知道輸入的SQL將要做什么,接下來就是進一步的優(yōu)化,具體操作如當查詢表里面有多個索引的時候,優(yōu)化器決定使用哪個索引;或者在一個語句有多表關聯 (join)的時候,決定各個表的連接順序。
5 第五步 執(zhí)行器
執(zhí)行器是用來操作數據存儲引擎的,分析器分析SQL的目標,優(yōu)化器決定執(zhí)行的方案,執(zhí)行器負責執(zhí)行職責。
