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