Mysql架構是什么?實際可以理解為執行一條sql語句所要經歷的階段有哪些!
1.連接層
(1)客戶端發起連接
? ?客戶端通過TCP/IP、Unix Socket或命名管道等方式向Mysql服務器發起鏈接請求
?想要了解tcp與udp的區別,可以參考這篇文章
https://blog.csdn.net/ymb615ymb/article/details/123449588?ops_request_misc=%257B%2522request%255Fid%2522%253A%252293c621ab4e488bbc0967bd9f87bd4418%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=93c621ab4e488bbc0967bd9f87bd4418&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-123449588-null-null.142^v102^pc_search_result_base7&utm_term=tcp%E4%B8%8Eudp%E7%9A%84%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187
(2)服務端接受鏈接
? 當mysql服務器接收到客戶端發來的請求后,服務器會建立一個線程或者連接句柄來處理客戶端? ? ? 的請求
? 大致來講,如果把mysql服務器當做一個進程的話,那么與每個客戶端建立的鏈接則可以當做一個線程
(3)身份驗證
? 連接層會驗證客戶端提供的用戶名和密碼
? 驗證通過后,連接層會檢查客戶端是否有權限訪問指定的數據庫
? 如果驗證失敗,連接層會拒絕鏈接并返回錯誤信息
(4)處理客戶端請求
? 客戶端發送sql查詢或者其他請求
? 連接層將請求傳遞給查詢解釋器和優化器(解釋器和優化器在后面會講到)進行處理
? 查詢執行完成后,連接層將結果返回給客戶端
?(5)關閉鏈接
2.緩存層
?緩存層是mysql中比較雞肋的部分....
?與其他應用中的緩存器一樣,mysql緩存層目的是為了減少數據庫負載(即多次查詢相同的數據庫內容),提高反應速度
? 但是mysql是通過sql語句來記錄是否執行緩存層的,什么意思?
?如我想查詢學生表中的所有信息,理論上?? select * from students 與 ?select * from ? ? ? ? students查詢的結果是一樣的,但是兩個語句之間空格數量一樣,緩存層就會認為這是不同的語句,無法發揮緩存的作用
? 所以mysql5.6/5.7版本中存在緩存層,但是默認是關閉的,而mysql.8.0則是直接去掉了緩存部分,用相應的業務層來做緩存
3.解釋層
(1)解析sql語句
? ? ? ? 解析sql語句會用到解析器組件(如第三方解析器組件Druid)
? ? ? ? 解析sql語句步驟:
? ? ? ? 客戶端將sql語句傳到mysql服務器->解析該sql語句 詞法和語法解析(關鍵字、條件、判斷表和字段是否存在)->生成解析樹
? ? ??
?(2)交給優化層
4.優化層
? ? 要想從北京去往上海是有多條路徑的但是哪個是最優路徑呢,那就得交給優化層了
(1)對于整個sql進行優化 優化器會對sql的條件進行調整 生成各種執行計劃
?(2)對sql進行具體優化 去掉沒必要的條件 EXPLAIN SELECT * FROM USER WHERE 1=1; SELECT*FROM USER;
?? (3)優化器會選擇合適的索引 但優化器不是萬能的并不能全部優化成功 需要人工干預 慢查詢就是例子
?
5.執行器與存儲引擎
? 存儲引擎在MySQL的邏輯架構中位于第三層,負責MySQL中的數據的存儲和提取。MySQL存儲引擎有很多,不同的存儲引擎保存數據和索引的方式是不同的。每一種存儲引擎都有它的優勢和劣勢。
可以使用 show engines; 命令來查看當前數據庫所支持的所有的存儲引擎。
?
舉例:
有的時候可能需要查詢速度快,不需要持久化,基于內存的操作,那么可以使用memory引擎。
有的數據是歷史數據,基本上不會新增及其查詢,提供壓縮的功能就可以使用archive引擎。
有的時候需要非常多的 讀寫,并發,數據一致性的操作,可以使用innodb引擎。