select * from T where ID=10;
在完成經典的 TCP 握手後,鏈接器就要開始認證你的身份,這個時候用的就是你輸入的用戶名和密碼。若是用戶名密碼認證經過,鏈接器會到權限表裏面查出你擁有的權限。以後,這個鏈接裏面的權限判斷邏輯,都將依賴於此時讀到的權限。(這就意味着,一個用戶成功創建鏈接後,即便你用管理員帳號對這個用戶的權限作了修改,也不會影響已經存在鏈接的權限。修改完成後,只有再新建的鏈接纔會使用新的權限設置。)
MySQL 拿到一個查詢請求後,會先到查詢緩存看看,以前是否是執行過這條語句。以前執行過的語句及其結果可能會以 key-value 對的形式,被直接緩存在內存中。key 是查詢的語句,value 是查詢的結果。若是你的查詢可以直接在這個緩存中找到 key,那麼這個 value 就會被直接返回給客戶端。
可是大多數狀況下建議不要使用查詢緩存,爲何呢?由於查詢緩存每每弊大於利。mysql
查詢緩存的失效很是頻繁,只要有對一個表的更新,這個表上全部的查詢緩存都會被清空。對於更新壓力大的數據庫來講,查詢緩存的命中率會很是低。除非你的業務就是有一張靜態表,很長時間纔會更新一次。好比,一個系統配置表,那這張表上的查詢才適合使用查詢緩存。 mysql能夠經過query_cache_type參數配置默認不進行緩存。若是配置了不進行緩存,執行sql語句時,能夠顯示指定使用緩存: select SQL_CACHE * from T where ID=10; 須要注意的是,MySQL 8.0 版本直接將查詢緩存的整塊功能刪掉了,也就是說 8.0 開始完全沒有這個功能了。
若是沒有命中查詢緩存,就要開始真正執行語句了.sql
分析器首先會進行sql解析。分爲如下幾個步驟:數據庫
1.詞法分析 解析sql語句,好比從select關鍵字識別這是一個查詢語句,將"T"識別成"表名T",把"ID"識別成"列ID" 2.語法分析 根據語法規則,判斷你的sql是否知足mysql語法
優化器是在表裏面有多個索引的時候,以爲使用哪一個索引;或者有多表join的時候,決定各個表的鏈接順序。緩存
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。 這兩種執行方法的邏輯結果是同樣的,可是執行的效率會有不一樣,而優化器的做用就是決定選擇使用哪個方案。
MySQL 經過分析器知道了你要作什麼,經過優化器知道了該怎麼作,因而就進入了執行器階段,開始執行語句。架構
select * from T where ID=10;
開始執行的時候,要先判斷一下你對這個表 T 有沒有執行查詢的權限。 若是有權限,就打開表繼續執行。打開表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的接口。 若是ID字段沒用索引,那麼執行流程是這樣的:優化
1. 調用 InnoDB 引擎接口取這個表的第一行,判斷 ID 值是否是 10,若是不是則跳過,若是是則將這行存在結果集中; 2. 調用引擎接口取「下一行」,重複相同的判斷邏輯,直到取到這個表的最後一行。 3. 執行器將上述遍歷過程當中全部知足條件的行組成的記錄集做爲結果集返回給客戶端。
極客時間:《mysql實戰45講》code