android连接ecs sql server_MySQL 执行 SQL 语句的过程解析
前言
作為一名菜鳥程序員,我已經工作兩年了。從事后端開發工作。
后端開發中,MySQL 可以說是必會的一門技能了。剛開始時我以為數據庫就是寫寫 SQL 語句,做做增刪改查業務。直到我寫的程序多次導致 MySQL 出現死鎖、大量慢查詢、數據庫壓力過大等問題,我意識到對于數據庫這門技術,了解它的性能優化以及內部原理是非常的重要。
這系列文章將會是我在學習 MySQL 過程中我學到的知識,我將從《高性能 MySQL》這本書,以及閱讀網絡上已有的其他 MySQL 教程中歸納總結,將我學到的知識記錄在這里。
同時也分享給同樣在學習的你。
那么開始學習吧~
M Y S Q LMySQL 基本架構
我們執行一條 SQL 語句,查看它的返回結果,這個過程是怎么在 MySQL 內部執行的呢?這里先從 MySQL 的基本架構說起。
MySQL 基本架構圖這張架構圖從上到下分別代表客戶端,Server 層和存儲引擎層。
MySQL 大體上可以分為 Server 層和存儲引擎層兩部分。
Server 層包括連接器、分析器、優化器、執行器和查詢緩存等。MySQL 中的大部分功能服務、所有的內置函數(CURDATE()、SUM()等)、存儲過程、函數、觸發器等功能,都是在這里實現的。
存儲引擎層可以理解為對數據操作的功能部分,負責存儲數據。我們熟知且常用的 InnoDB 引擎就在這里。從圖中可以看出存儲引擎不止有 InnoDB 一個,還有 MyISAM、Memory 等,不同的存儲引擎共同使用同一個 Server 層。
查詢語句在 MySQL 中執行過程是怎樣的?
首先作為請求發起者,客戶端與 MySQL 建立連接,這時候就是連接器在發揮作用。
1.連接器
連接器的作用就是跟客戶端建立連接、檢查權限、管理連接。
在客戶端與 MySQL 服務端完成 TCP 三次握手后,連接器會對客戶端的身份進行校驗認證:檢查客戶端輸入的用戶名和密碼。
如果用戶名或者密碼不正確,將會報錯Access denied for user 。
認證通過后,連接器會查詢出該客戶端所擁有的數據庫操作權限:是否可以查詢、插入、更新、刪除等等。之后進行的數據庫操作是否有權限執行,就是依賴在這里讀到的權限。
2.查詢緩存
拿到 SQL 查詢請求后,MySQL 會先看看緩存,如果之前執行過這個語句,就不需要在執行了,直接返回緩存里的結果。
如果沒有命中緩存,就繼續執行后面的操作,查詢完畢后,結果會存入緩存中。
這個功能在 MySQL 8.0 被刪除了。
如果用的是 5.x 版本,多數情況下緩存也不建議使用。因為當一個表更新了,這個表的查詢緩存就都被清掉了,頻繁更新的表基本上沒有太多機會命中緩存。如果是很久不會變更數據的配置表,倒是比較適合做查詢緩存。
3.分析器
開始執行語句,MySQL 要對 SQL 語句做解析工作,來知道你想通過 SQL 表達什么,讓 MySQL 做什么。
首先是識別出你的 SQL 字符串語句每個詞匯、空格組合在一起代表什么。把關鍵字 SELECT 識別出來要做查詢語句,把 id 識別出是這個表的主鍵字段等等。
然后分析出這條 SQL 語句是否有語法錯誤,比如關鍵字是不是寫錯了。
完整正確的 SQL 就會通過分析器,走到下一步。
4.優化器
現在 SQL 是對的了,MySQL 優化器會生成一個執行計劃。
使用哪個索引?
JOIN 語句關聯的查詢順序?
怎么查詢效率高?
這就是優化器的作用。
5.執行器
此時經過優化器,MySQL 知道怎么執行這條 SQL 語句,執行器這里就來執行它。
此時判斷你的權限,比如這條語句要 SELECT,但是賬號沒有這個權限(連接器階段查得),就會報錯。
有權限,就繼續執行。
SELECT * FROM student WHERE student_name = 'Tom';比如這個 SQL,假設 student_name 字段沒有索引,就會調用存儲引擎從第一條開始查,如果學生名字是 Tom, 就把這行存在結果集,不是就不存并跳過。
接下來查看下一行,重復上一步的操作,直到讀完整個表,到最后一行退出。
最后執行器會把結果集存的記錄返回給客戶端。
到這里,整個 SQL 執行過程就結束了。
經過這么一分析,是不是感覺對 MySQL 更了解了呢?:-)
總結
以上是生活随笔為你收集整理的android连接ecs sql server_MySQL 执行 SQL 语句的过程解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python脚本根据cookies自动登
- 下一篇: 融通新蓝筹怎么赎回