聯結器
建立連結比較複雜,建議使用長連線,需要注意,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欄位,可以直到這個語句掃描了多少行。