最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL通透詳解架構(gòu)設(shè)計(jì)

 更新時間:2022年02月07日 15:33:00   作者:JavaEdge.  
這篇文章主要介紹了MySQL架構(gòu)設(shè)計(jì)相關(guān)基礎(chǔ)與原則,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下

系統(tǒng)只要能從數(shù)據(jù)庫連接池獲取到一個數(shù)據(jù)庫連接,就能執(zhí)行CRUD??赏ㄟ^數(shù)據(jù)庫連接將待執(zhí)行SQL發(fā)給MySQL。

大部分 crud boy只知道:

  • 執(zhí)行insert語句后,在表里會多條數(shù)據(jù)
  • 執(zhí)行update后,會更改表數(shù)據(jù)
  • 執(zhí)行delete后,會刪除表里數(shù)據(jù)
  • 執(zhí)行select后,會查詢表里數(shù)據(jù)出來
  • 要是SQL性能丟人,建幾個索引解決

這應(yīng)該是目前行業(yè)內(nèi)很多工程師對數(shù)據(jù)庫的一個認(rèn)知,完全當(dāng)他是個黑盒來建表及執(zhí)行SQL。

網(wǎng)絡(luò)連接必須有線程處理

假設(shè)數(shù)據(jù)庫服務(wù)器的連接池中的某個連接,接收到一條SQL網(wǎng)絡(luò)請求,請思考:

  • 誰負(fù)責(zé)從這個連接中去監(jiān)聽網(wǎng)絡(luò)請求?
  • 誰負(fù)責(zé)從網(wǎng)絡(luò)連接里把請求數(shù)據(jù)讀取出來?

網(wǎng)絡(luò)連接得有一個線程來監(jiān)聽請求及讀取請求數(shù)據(jù),比如從網(wǎng)絡(luò)連接中讀取和解析出來一條業(yè)務(wù)系統(tǒng)發(fā)的SQL語句:

img

SQL接口

負(fù)責(zé)處理接收到的SQL語句。

MySQL的工作線程從一個網(wǎng)絡(luò)連接中讀出一個SQL語句后,會如何執(zhí)行該SQL呢?

MySQL提供了SQL接口(SQL Interface),一套執(zhí)行SQL語句的接口,專門執(zhí)行業(yè)務(wù)系統(tǒng)發(fā)送的那些CRUD語句

因此MySQL的工作線程接收到SQL語句之后,就會轉(zhuǎn)交給SQL接口去執(zhí)行:

查詢解析器

那SQL接口怎么執(zhí)行SQL語句的?這玩意能懂這些SQL語句?

假設(shè)有如下SQL:

select id,name,age from users where id=1

這就需要查詢解析器(Parser),負(fù)責(zé)解析SQL語句,比如對那個SQL拆解成:

  • 要從“users”表里查詢數(shù)據(jù)
  • 查詢“id”字段的值等于1的那行數(shù)據(jù)
  • 對查出來的那行數(shù)據(jù)要提取里面的“id,name,age”三字段

SQL解析也就是按SQL語法來解析SQL語句意欲何為:

查詢優(yōu)化器

通過解析器知道SQL要干啥了,然后就得找查詢優(yōu)化器(Optimizer)選擇一個最優(yōu)查詢路徑。

啥叫最優(yōu)查詢路徑呢?

之前的那個SQL:從“users”表里查詢數(shù)據(jù),查“id”字段的值等于1的那行數(shù)據(jù),對查出來的那行數(shù)據(jù)要提取里面的“id,name,age”三個字段。

要完成此事有如下查詢路徑:

  • 直接定位到users表中的id字段等于1的那行數(shù)據(jù),查出來那行數(shù)據(jù)的id、name、age三個字段值
  • 先把users表中的每行數(shù)據(jù)的“id,name,age”三個字段的值都查出來,然后從這批數(shù)據(jù)里過濾出來“id”字段等于1的那行數(shù)據(jù)的“id,name,age”三個字段

可見,完成該SQL,兩條路徑都能實(shí)現(xiàn),那到底選哪個呢?顯然第一種性能更好。

所以查詢優(yōu)化器大概就是這個意義,他會針對你的SQL生成查詢路徑樹,選擇最優(yōu)查詢路徑。

調(diào)用存儲引擎接口,真正執(zhí)行SQL語句。

把查詢優(yōu)化器選擇的最優(yōu)查詢路徑,即到底應(yīng)該按照一個什么樣的順序和步驟去執(zhí)行這個SQL語句的計(jì)劃,把該計(jì)劃交給底層的存儲引擎去真正執(zhí)行。

假設(shè)我們的數(shù)據(jù)有的存在內(nèi)存,有的存在磁盤文件,那到底怎么知道

  • 哪些數(shù)據(jù)在內(nèi)存?
  • 哪些在磁盤?

執(zhí)行時:

  • 是更新內(nèi)存數(shù)據(jù)?
  • 還是更新磁盤數(shù)據(jù)?

若更新磁盤數(shù)據(jù):

  • 先查詢哪個磁盤文件
  • 再更新哪個磁盤文件?

這就需要存儲引擎,就是個執(zhí)行SQL語句的,會按步驟查詢內(nèi)存緩存數(shù)據(jù),更新磁盤數(shù) 據(jù),查詢磁盤數(shù)據(jù)等,執(zhí)行此類的一系列的操作:

MySQL架構(gòu)設(shè)計(jì)中,SQL接口、SQL解析器、查詢優(yōu)化器都是通用的,屬于一套組件。但支持各種存儲引擎,如InnoDB、MyISAM、Memory等,可以選擇具體使用哪種存儲引擎來負(fù)責(zé)執(zhí)行SQL。

執(zhí)行器

根據(jù)執(zhí)行計(jì)劃調(diào)用存儲引擎的接口。

存儲引擎可幫助我們?nèi)ピL問內(nèi)存及磁盤上的數(shù)據(jù),那誰來調(diào)存儲引擎的接口?

那就是執(zhí)行器,會根據(jù)優(yōu)化器選擇的執(zhí)行方案,按照一定的順序和步驟調(diào)用存儲引擎的接口,執(zhí)行SQL邏輯。

比如執(zhí)行器可能先調(diào)用存儲引擎的一個接口,獲取“users”表中的第一行數(shù)據(jù),然后判斷一下這個數(shù)據(jù)的“id”字段的值是否等于我們期望的一個值,如果不是的話,那就繼續(xù)調(diào)用存儲引擎的接口,去獲取“users”表的下一行數(shù)據(jù)。

也就這套操作,執(zhí)行器會根據(jù)優(yōu)化器生成的執(zhí)行計(jì)劃,不停調(diào)用存儲引擎的接口們,去完成SQL語句的執(zhí)行計(jì)劃,即不停的更新或提取一些數(shù)據(jù):

到此這篇關(guān)于MySQL通透詳解架構(gòu)設(shè)計(jì)的文章就介紹到這了,更多相關(guān)MySQL 架構(gòu)設(shè)計(jì)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

富锦市| 博爱县| 辉县市| 诏安县| 乌鲁木齐县| 阿城市| 宾川县| 苏州市| 河源市| 雷波县| 恭城| 河东区| 伊金霍洛旗| 孙吴县| 凤庆县| 洪雅县| 拜城县| 潢川县| 四子王旗| 广河县| 湘阴县| 徐州市| 银川市| 饶平县| 高平市| 汶川县| 芒康县| 新建县| 双江| 罗田县| 石林| 抚远县| 鄂伦春自治旗| 庆云县| 涿州市| 来安县| 海南省| 视频| 苏尼特左旗| 鄯善县| 南漳县|