深刻學習MySQL 01 一條查詢語句的執行過程

在學習SpringCloud的同時,也在深刻學習MySq中,聽着<mysql45講>,,看着<高性能MySQL>,本系列文章是本人學習過程的總結,水平有限,僅供參考,如有不對之處或有啥建議均可與我聯繫,感謝!</mysql45講>html

在學習一個東西以前,瞭解它的歷史都是頗有必要的,那麼首先,咱們先來了解MySQL的歷史。mysql

MySQL的前世此生

1.1990年,有一個小夥子被客戶要求提供通用的SQL支持,當時他首先借助了mSQL的代碼進行集成,但效果不太滿意,便本身重寫了一個SQL支持。sql

2.1995年,1.0版的MySQL發佈,內部引擎爲ISAM。數據庫

3.1999年,MySQL AB公司成立,並開發出Berkeley DB引擎,BDB引擎支持事務,這是MySql第一個支持事務的引擎。緩存

4.2000年,MySQL開源,從新整理存儲引擎ISAM,重命名MyISAM。架構

5.2001年,集成了存儲引擎InnoDB,這個引擎不只能持事務處理,而且支持行級鎖。後來該引擎被證實是最爲成功的MySQL事務存儲引擎。函數

6.2006年,Oracle把InnoDB引擎的開發公司innobase收購完成。MySQL明確地表現出邁向高性能數據庫的發展步伐。性能

7.2008年,Sun公司以10億收購了MySQL AB。學習

8.螳螂捕蟬,黃雀在後。2009年,數據庫老大Oracle大筆一揮,74億美將Sun和MySQL通盤收於旗下,今後MySQL數據庫進入Oracle時代。優化

9.2010年,MySQL 5.5正式版發佈,Oracle完成了大量改進,並將innodb改爲默認引擎。

10.因爲MySQL的開源性被普遍傳播,也被更多的人瞭解。伴隨着更多的技術開發人員加入到MySQL開發中,今後它被不斷完善,一步一步邁向人生巔峯。

11.歷史只須要了解,不須要背誦哈~

MySQL邏輯架構

MySQL邏輯架構圖(源自&lt;MySQL45講&gt;)

大致上,MySQL分爲Server層和存儲引擎層。

Server層包括鏈接器、查詢緩存、分析器、優化器、執行器等。這一層提供了一些核心公用服務,包括了內置函數、視圖、觸發器等功能。

存儲引擎層主要是提供數據存儲與提取服務,它是插件式的,支持MyISAM、InnoDB、Memory等。MySQL5.5起,默認使用InnoDB

查詢語句的執行過程

sql語句:select * from T where ID = 1

1.鏈接器
首先須要通過鏈接器,創建與MySQL的鏈接,在這裏會作身份認證(驗證帳號密碼)、權限讀取(獲取你的相關權限,用於作權限的邏輯判斷),並且這會有個線程池用於管理線程

2.查詢緩存
驗證身份經過後,會在查詢緩存中查詢找有沒有緩存,命中的話就直接返回結果,不然進入分析器。查詢緩存是以鍵值對的形式保存緩存的,key存儲sql語句,value存儲查詢結果。

ps:建議關閉查詢緩存。由於當表的更新時,相應表的查詢緩存會被所有清空,這會致使緩存的命中率很低,維護查詢緩存也會消耗必定的性能

3.分析器
首先進行"詞法分析",從你輸入的SQL中識別出"select"則認爲這是查詢語句,還會識別出"T"爲表名,"ID"爲列名等等

而後進行"語法分析",判斷整個sql語句是否錯誤,並判斷是否存在"T"表,是否存在列"ID"
4.優化器
在這會對SQL語句進行優化,好比索引的選取,多表關聯(join)時鏈接表的順序等,而後選取最優的方案生成執行計劃

ps:優化器有時也會有出錯,好比選錯索引

5.執行器
首先判斷該用戶有無對該表查詢的權限,無則直接返回,有則根據執行計劃執行SQL語句。
執行完成後,將結果緩存到查詢緩存中,並返回結果給客戶端。

至此,一條查詢語句執行完了

參考 《MySQL45講》

《高性能MySQL》
  https://www.cnblogs.com/eyesf...

若是以爲不錯,分享給你的朋友!

image

image

 THANDKS

  • End -

一個立志成大腿而天天努力奮鬥的年輕人

伴學習伴成長,成長之路你並不孤單!

 掃描二維碼,關注公衆號

相關文章
相關標籤/搜索