【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的
文章目錄
- 1 一條SQL查詢(xún)語(yǔ)句是如何執(zhí)行的
- 2 mysql體系結(jié)構(gòu)
- 3 InnoDB存儲(chǔ)引擎
- 4 總結(jié)
1 一條SQL查詢(xún)語(yǔ)句是如何執(zhí)行的
? 通常我們使用數(shù)據(jù)庫(kù),都是將數(shù)據(jù)庫(kù)看成一個(gè)整體,我們的應(yīng)用與數(shù)據(jù)庫(kù)完全就是通過(guò)SQL語(yǔ)句進(jìn)行交互。大多數(shù)開(kāi)發(fā)者很少去了解數(shù)據(jù)庫(kù)的內(nèi)部實(shí)現(xiàn)原理,這樣也可以完成我們的應(yīng)用。但是如果遇到一些疑難問(wèn)題,如查詢(xún)變慢、死鎖、數(shù)據(jù)庫(kù)宕機(jī)需要恢復(fù)數(shù)據(jù)時(shí),我們就需要對(duì)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)原理有一定的了解,才能解決這些問(wèn)題。了解一個(gè)東西,先鳥(niǎo)瞰其全貌,再一步步深入到內(nèi)部。
? 想要了解mysql的基礎(chǔ)架構(gòu),從最簡(jiǎn)單的SQL查詢(xún)語(yǔ)句來(lái)分析,當(dāng)了解了mysql是如何執(zhí)行一條SQL查詢(xún)語(yǔ)句后,就基本了解了mysql的基礎(chǔ)體系結(jié)構(gòu)。
? 下面是一條最簡(jiǎn)單的SQL查詢(xún)語(yǔ)句:
select * from T where id = 2;? 對(duì)于應(yīng)用開(kāi)發(fā)者來(lái)說(shuō),看到的就是輸入一條語(yǔ)句,返回一個(gè)結(jié)果。下面是mysql的基本架構(gòu)簡(jiǎn)單示意圖,這條語(yǔ)句會(huì)經(jīng)過(guò)這些過(guò)程。
? 大體來(lái)說(shuō),mysql可以分為server層和存儲(chǔ)引擎層。
- server層包括
連接器:連接器負(fù)責(zé)跟客戶(hù)端建立連接、獲取權(quán)限、維持和管理連接等。
查詢(xún)緩存:建立連接后就應(yīng)該進(jìn)行數(shù)據(jù)的查詢(xún)。在真正進(jìn)行數(shù)據(jù)查詢(xún)之前,mysql會(huì)先到緩存查看,之前是否執(zhí)行過(guò)這條語(yǔ)句,如果執(zhí)行過(guò),會(huì)在緩存中緩存這條查詢(xún)對(duì)應(yīng)的返回?cái)?shù)據(jù),此時(shí)可以直接從緩存中獲取。如果不在緩存中,則繼續(xù)后面的流程。
2.1 大多數(shù)情況下不建議使用查詢(xún)緩存的功能,因?yàn)椴樵?xún)緩存弊大于利。查詢(xún)緩存失效非常頻繁,只要有對(duì)表的更新操作,這個(gè)表上所有的查詢(xún)緩存就會(huì)被清空,因此很有肯能你很費(fèi)勁地把結(jié)果存起來(lái),還沒(méi)使用就被一個(gè)更新操作清空了。對(duì)于更新壓力大的數(shù)據(jù)庫(kù)來(lái)說(shuō),查詢(xún)緩存的命中率非常低。mysql8.0以后直接將查詢(xún)緩存的功能刪掉了。
分析器:如果沒(méi)有命中緩存,就開(kāi)始這正的執(zhí)行查詢(xún)了。mysql首先會(huì)需要對(duì)你提交的SQL語(yǔ)句進(jìn)行校驗(yàn)與分析,看是否是正確的SQL語(yǔ)句。分析器主要包括詞法分析、語(yǔ)法分析,后面的文章會(huì)對(duì)其進(jìn)行詳細(xì)的分析。
優(yōu)化器:當(dāng)SQL語(yǔ)句校驗(yàn)成功,沒(méi)有語(yǔ)法錯(cuò)誤,會(huì)進(jìn)行優(yōu)化器優(yōu)化,優(yōu)化器主要是在表里有多個(gè)索引的時(shí)候決定使用哪個(gè)索引,或者在一個(gè)語(yǔ)句有多表關(guān)聯(lián)(jion)的時(shí)候,決定各個(gè)表的連接順序。
執(zhí)行器:mysql通過(guò)分析器知道了要做什么,通過(guò)優(yōu)化器知道了要怎么做。于是就進(jìn)入了執(zhí)行階段,開(kāi)始執(zhí)行語(yǔ)句。
? 上面就是一條SQL查詢(xún)語(yǔ)句的簡(jiǎn)單執(zhí)行過(guò)程,只是加單的描述了大概的流程,當(dāng)然里面的細(xì)節(jié)非常負(fù)責(zé),這在后面的文章中會(huì)進(jìn)行一一拆解。
2 mysql體系結(jié)構(gòu)
? 在了解了上面的一條SQL查詢(xún)語(yǔ)句的執(zhí)行流程后,我們?cè)賮?lái)看下,mysql完整的體系結(jié)構(gòu)是什么樣。
? 從以上mysql的體系結(jié)構(gòu)中可以看出,主要有以下幾個(gè)部分組成。
- 連接池組件
- 管理服務(wù)和工具組件
- SQL接口組件
- 查詢(xún)分析器組件
- 優(yōu)化器組件
- 緩沖組件插件式存儲(chǔ)引擎
- 物理文件
? mysql數(shù)據(jù)庫(kù)區(qū)別于其他數(shù)據(jù)庫(kù)的最重要的一個(gè)特點(diǎn)就是其插件式的表存儲(chǔ)引擎。mysq插件式的存儲(chǔ)引擎架構(gòu)提供了一系列標(biāo)準(zhǔn)的管理和服務(wù)支持,這些標(biāo)準(zhǔn)與存儲(chǔ)引擎本身無(wú)關(guān),可能是每個(gè)數(shù)據(jù)庫(kù)系統(tǒng)本身都需要的,如SQL分析器和優(yōu)化器。存儲(chǔ)引擎是底層物理結(jié)構(gòu)的實(shí)現(xiàn),每個(gè)存儲(chǔ)引擎開(kāi)發(fā)者可以按照自己的意愿來(lái)進(jìn)行開(kāi)發(fā)。
? 需要特別注意的是,存儲(chǔ)引擎是基于表的,而非數(shù)據(jù)庫(kù)的。我們最好牢記上面的mysql體系結(jié)構(gòu),對(duì)我們后面深入理解mysql數(shù)據(jù)庫(kù)有很大的幫助。
3 InnoDB存儲(chǔ)引擎
? 我們已經(jīng)大致了解了mysql數(shù)據(jù)庫(kù)獨(dú)有的插件式體系結(jié)構(gòu),病了解到存儲(chǔ)引擎是mysql數(shù)據(jù)庫(kù)區(qū)別于其他數(shù)據(jù)庫(kù)的一個(gè)最重要的特性。存儲(chǔ)引擎的好處是,每個(gè)存儲(chǔ)引擎都有各自的特點(diǎn),能夠根據(jù)具體的應(yīng)用建立不同的存儲(chǔ)引擎表。我們業(yè)務(wù)應(yīng)用開(kāi)發(fā)平時(shí)所說(shuō)的事務(wù)、鎖、B+樹(shù)索引等,也都是在存儲(chǔ)引擎層實(shí)現(xiàn)的。其中InnoDB存儲(chǔ)引擎是目前最常用的一種存儲(chǔ)引擎,所以我們總是圍繞著InnoDB的原理進(jìn)行講解。
?
? InnoDB存儲(chǔ)引擎支持事務(wù),其設(shè)計(jì)的主要目標(biāo)是面向在線(xiàn)事務(wù)處理的應(yīng)用(OLTP),其特點(diǎn)是行鎖設(shè)計(jì)、支持外鍵、并通過(guò)使用多版本并發(fā)控制支持一致性非鎖定讀。并且實(shí)現(xiàn)了SQL的四種隔離級(jí)別。默認(rèn)為RR(REPEATABLE READ)隔離級(jí)別,同時(shí)使用next-key locking 的策略來(lái)避免幻讀(phantom)現(xiàn)象的產(chǎn)生。除此之外,InnoDB存儲(chǔ)引擎還提供了插入緩沖(insert buffer)、二次寫(xiě)(double write)、自適應(yīng)哈希索引、預(yù)讀(read ahead)等高性能和高可用的功能。
? 對(duì)于標(biāo)準(zhǔn)紅數(shù)據(jù)的存儲(chǔ),InnoDB采用聚集(clustered)的方式,因此每張表的存儲(chǔ)都是按照主鍵的順序進(jìn)行存放。
4 總結(jié)
? 本文是接下來(lái)對(duì)mysql數(shù)據(jù)庫(kù)拆解,并深入分析的基礎(chǔ),我們主要掌握mysql體系結(jié)構(gòu)的圖,把上面的圖背下來(lái)也行,對(duì)后面理解索引、鎖、以及mysql優(yōu)化都有莫大的好處。
總結(jié)
以上是生活随笔為你收集整理的【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机如何打开无线网络适配器,win7系
- 下一篇: 修改了sql默认路径无法登录服务器,Po