mysql實戰(zhàn)之MySQL基礎(chǔ)架構(gòu)

MySQL實戰(zhàn)01:一條SQL語句是如何執(zhí)行的?

1.mysql的基礎(chǔ)架構(gòu)圖

image

2.每個組件的介紹和功能

2.1?連接器

??1.連接器負責(zé)和客戶端建立連接、獲取權(quán)限、維持和管理連接;
??2.連接命令:mysql -hip -pport -u$user -p
??3.show processlist命令是來查看當(dāng)前運行進程列表,客戶端如果長時間沒有進行連接的話,連接器就會自動斷開連接,這個時間是由參數(shù)wait_timeout控制的。
??4.數(shù)據(jù)庫分為長連接(是指數(shù)據(jù)庫連接成功后,如果客戶端持續(xù)有請求的話就一直使用同一個連接。)和短連接(是指每次執(zhí)行完很少的幾個查詢就會斷開連接,下次查詢的時候就會重新再建立一個連接)
??5.因為建立連接的過程是比較復(fù)雜的,所以建議使用長連接;但是使用長連接的時候,有時候mysql會占用過多的內(nèi)存,導(dǎo)致被系統(tǒng)強行殺掉,也就是MySQL異常重啟。
???5.1如何解決這個問題:
????5.1.1.定期斷開連接;(使用一段時間;程序在執(zhí)行完一個占用內(nèi)存比較大的查詢之后可以斷開連接等到要執(zhí)行下一個查詢的時候在進行連接。)
????5.1.2.使用MySQL5.7及以上的版本時候,可以在每次執(zhí)行一個比較大的操作的時候,通過執(zhí)行mysql_reset_connection來重新初始化連接資源。這個過程不需要重連和重新做權(quán)限驗證,但是會恢復(fù)到剛連接時候的狀態(tài)。

2.2?查詢緩存

??1.mysql在拿到一個查詢請求的時候,會去查詢緩存看看,之前是不是執(zhí)行過并且在被以key-value(SQL語句以及對應(yīng)的查詢結(jié)果)對的形式緩存到內(nèi)存中,如果在查詢緩存中的話就會被直接拿出來返回給客戶端,否則就會繼續(xù)下面的操作,等到執(zhí)行完成后就會被存入查詢緩存中去。因此如果查詢命中緩存的話,mysql就不需要執(zhí)行下面的操作,可以直接返回查詢結(jié)果,這個效率是很高的。
??2.但是我不建議使用查詢緩存,因為在大多情況下使用查詢緩存是弊大于利的?
???2.1查詢緩存的失效是非常頻繁的,只用對莫一個表執(zhí)行一次更新操作的話,那么該表的查詢緩存就會失效(都被清空)。因此對于更新壓力比較大的數(shù)據(jù)庫來說,查詢緩存的命中率非常低。
???2.2因此mysql提供了“按需使用”,將參數(shù)query_cache_type設(shè)置成demand,這樣對于默認(rèn)的SQL語句都不使用查詢緩存。而你對于要使用查詢緩存的語句可以使用SQL_CACHE進行顯示指定,就像下面的語句一樣:select SQL_CACHE * from T where id = 10
??3.需要注意的是在mysql8.0版本之后都沒有查詢緩存這個功能了。

2.3?分析器

??1.如果沒有命中緩存的話,就會開始進行詞法分析(mysql需要分析你的語句中的多個字符串是什么以及所代表的含義,例如把select這個關(guān)鍵字識別出來,其代表查詢語句;字符串T代表表名,column代表列column)以及語法分析(根據(jù)詞法分析的結(jié)果,語法分析會根據(jù)mysql語法的規(guī)則來判斷你是否符合mysql的語法,否則會出現(xiàn)you have an error in your sql syntax)。

2.4?優(yōu)化器

??1.在開始執(zhí)行前還需要經(jīng)過優(yōu)化器的處理,優(yōu)化器是在表里面有多個索引的時候,決定使用哪一個索引;或者在一個語句中有多表關(guān)聯(lián)的時候,決定各個表的連接順序。總之,優(yōu)化器就是決定選擇哪一種方案來進行執(zhí)行。

2.5?執(zhí)行器

??1.開始執(zhí)行的時候會判斷你是否有沒有權(quán)限去對該表進行(查詢、更新、刪除、插入)操作,如果有權(quán)限的話,就打開表繼續(xù)執(zhí)行,否則就會返回沒有權(quán)限的錯誤。執(zhí)行過程:
????????1.調(diào)用 InnoDB 引擎接口取這個表的第一行,判斷ID值是不是10,如果不是則跳過,如果是則將這行存在結(jié)果集中;
????????2.調(diào)用引擎接口取下一行,然后繼續(xù)判斷是否滿足條件,如果滿足將這行存入結(jié)果集中,否則就繼續(xù)以上的操作,直至取到表中的最后一行。
????????3.執(zhí)行器將上述遍歷之后滿足的行存入結(jié)果集中返回給客戶端。

3.?問題

??1.如果表T中沒有字段 k,而你執(zhí)行了這個語句 select * from T where k=1, 那肯定是會報“不存在這個列”的錯誤: “Unknown column 'k' in 'where clause'”,你覺得這個錯誤會在哪里個階段暴露出來?
答案:?是在分析器的時候就被發(fā)現(xiàn)了,分析器會進行詞法分析,發(fā)現(xiàn)表中不存在該字段,因此返回該錯誤,而有的人會說在執(zhí)行器中才被發(fā)現(xiàn),因為執(zhí)行器階段才會打開表,但是K是表的結(jié)構(gòu),是一個字段而不是數(shù)據(jù),可以在直接讀取的不需要打開表,因此不是在執(zhí)行器階段。
參考引用:Mysql實現(xiàn)(極客時間),侵刪!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容