一、聯結器
在完成經典的 tcp 握手後,聯結器就要開始認證你的身份,這個時候用的就是你輸入的使用者名稱和密碼。如果使用者名稱密碼認證通過,聯結器會到許可權表裡面查出你擁有的許可權。之後,這個連線裡面的許可權判斷邏輯,都將依賴於此時讀到的許可權。(這就意味著,乙個使用者成功建立連線後,即使你用管理員賬號對這個使用者的許可權做了修改,也不會影響已經存在連線的許可權。修改完成後,只有再新建的連線才會使用新的許可權設定。)
二、查詢快取
mysql 拿到乙個查詢請求後,會先到查詢快取看看,之前是不是執行過這條語句。之前執行過的語句及其結果可能會以 key-value 對的形式,被直接快取在記憶體中。key 是查詢的語句,value 是查詢的結果。如果你的查詢能夠直接在這個快取中找到 key,那麼這個 value 就會被直接返回給客戶端。
但是大多數情況下建議不要使用查詢快取,為什麼呢?因為查詢快取往往弊大於利。
查詢快取的失效非常頻繁,只要有對乙個表的更新,這個表上所有的查詢快取都會被清空。對於更新壓力大的資料庫來說,查詢快取的命中率會非常低。除非你的業務就是有一張靜態表,很長時間才會更新一次。比如,乙個系統配置表,那這張表上的查詢才適合使用查詢快取。
mysql可以通過query_cache_type引數配置預設不進行快取。如果配置了不進行快取,執行sql語句時,可以顯示指定使用快取:
select sql_cache * from t where id=10;
需要注意的是,mysql 8.0 版本直接將查詢快取的整塊功能刪掉了,也就是說 8.0 開始徹底沒有這個功能了。
三、分析器
如果沒有命中查詢快取,就要開始真正執行語句了.
分析器首先會進行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. 執行器將上述遍歷過程中所有滿足條件的行組成的記錄集作為結果集返回給客戶端。
01 Spark架構與執行流程
1.闡述hadoop生態系統中,hdfs,mapreduce,yarn,hbase及spark的相互關係,為什麼要引入yarn和spark。答 hadoop對應於google三駕馬車 hdfs對應於gfs,即分布式檔案系統,mapreduce即平行計算框架,hbase對應於bigtable,即分布式...
01 Spark架構與執行流程
1.闡述hadoop生態系統中,hdfs,mapreduce,yarn,hbase及spark的相互關係,為什麼要引入yarn和spark。hdfs hadoop分布式檔案系統 源自於google的gfs 發表於2003年10月,hdfs是gfs的實現版。hdfs是hadoop體系中資料儲存管理的基...
01 Spark架構與執行流程
1.闡述hadoop生態系統中,hdfs,mapreduce,yarn,hbase及spark的相互關係,為什麼要引入yarn和spark。1 引用yarn是為了解決原始hadoop擴充套件性差,不支援多計算框架而提出的 2 spark的速度比hadoop更快。同樣的事情,hadoop要兩分鐘,而s...