sql查詢是如何執行的?

李宗俍發表於2019-04-26

sql查詢是如何執行的?


聯結器

 建立連結比較複雜,建議使用長連線,需要注意,mysql在執行過程中臨時使用的記憶體是管理在連線物件裡面的,只有斷開連結的時候才會釋放。

解決方案:1. 定期斷開連結(一般代理層會做) 2.  5.7以後可以使用mysql_reset_connection來初始化連結資源

show processlist ;  -- 查所有連線。複製程式碼

快取

key value形式儲存,key是sql語句,value是查詢結果。不建議使用快取,

快取適合場景,靜態表,比如系統配置表,mysql8.0徹底刪除快取


分析器

除了此法分析之外,會判斷表和欄位是否存在。都在分析器這一層解決。


優化器

分析器之後mysql已經知道要做什麼了,再次之前需要進行優化處理。比如下面一條sql

select * from t1 join t2 using(ID) where t1.a = 1 and t2.b = 1;複製程式碼

1. 執行t1 並找出a=1,關聯t2,找出t2.b=1 的值。

2. 執行t2並找出b=1,關聯t1,,找出t1.a=1的值。

具體使用那條規則是由優化器來決定的。


執行器

mysql通過分析器知道自己要做什麼。通過優化器知道自己該怎們做。於是進入執行器

首先判斷是否有許可權,如果有會呼叫儲存引擎的介面,例如下面一條sql

select * from T where name = 't';  -- name無索引複製程式碼

1. innodb儲存引擎會取表的第一行,判斷name是否等於t,不是跳過,是的存到結果集

2. 取下一行,重複相同的邏輯,直到遍歷所有結果,然後把滿足結果集返回給客戶端。


慢查詢日誌中通過 rows_examined欄位,可以直到這個語句掃描了多少行。



相關文章