丨學(xué)會(huì)用數(shù)據(jù)庫的方式思考sql是如何執(zhí)行_第1頁
丨學(xué)會(huì)用數(shù)據(jù)庫的方式思考sql是如何執(zhí)行_第2頁
丨學(xué)會(huì)用數(shù)據(jù)庫的方式思考sql是如何執(zhí)行_第3頁
丨學(xué)會(huì)用數(shù)據(jù)庫的方式思考sql是如何執(zhí)行_第4頁
丨學(xué)會(huì)用數(shù)據(jù)庫的方式思考sql是如何執(zhí)行_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

系統(tǒng))中,SQL的實(shí)現(xiàn)方式還是有差別的。今天我們就從數(shù) 下SQL是如何被執(zhí)行的。關(guān)于今天的內(nèi)容,你會(huì)從以下幾個(gè)方面進(jìn)Oracle的SQL如何執(zhí)行的,什么是硬解析和軟解MySQL的SQL如何執(zhí)行的,MySQL體系結(jié)構(gòu)又什么是引擎,MySQL的引擎都有哪些OracleSQL我們先來看下SQL在Oracle中的執(zhí)行過從上面這張圖中可以看出,SQL句在Oracle經(jīng)歷了以語法檢查:檢查SQL拼寫是否正確,如果不正確Oracle會(huì)報(bào)語法錯(cuò)誤語義檢查:檢查SQL中的對(duì)象是否存在。比如我們在寫SELECT句的時(shí)候,列名寫錯(cuò)了,系統(tǒng)就會(huì)提示錯(cuò)誤。語法檢查和語義檢查的作用是保證SQL語句沒有錯(cuò)權(quán)限檢查:看用戶是否具備該數(shù)據(jù)的權(quán)限共享池檢查:共享池(SharedPool)是一塊內(nèi)存池,最主要的作用是緩存SQL語句和該語句的執(zhí)行計(jì)劃。Oracle過檢查共享池是否存在SQL的執(zhí)行計(jì)劃,在共享池中,Oracle首先對(duì)SQL語句進(jìn)行Hash運(yùn)算,然后根據(jù)Hash值在庫緩存(LibraryCache)中查找,如果存在SQL語句的執(zhí)行計(jì)劃,就直接拿來執(zhí)行,直接如果沒有找到SQL語句和執(zhí)行計(jì)劃,Oracle就需要?jiǎng)?chuàng)建解析樹進(jìn)行解析,生成執(zhí)行計(jì)劃,進(jìn)入“優(yōu)化器”這個(gè)步執(zhí)行器:當(dāng)有了解析樹和執(zhí)行計(jì)劃之后,就知道了該怎么被執(zhí)行,這樣就可以在執(zhí)行器中執(zhí)行語句了共享池是Oracle中的術(shù)語,包括了庫緩存,數(shù)據(jù)字典緩沖區(qū)等。我們上面已經(jīng)講到了庫緩存區(qū),它主要緩存SQL語句和執(zhí)行計(jì)劃。而數(shù)據(jù)字典緩沖區(qū)的是Oracle中的對(duì)象定義,比如表、視圖、索引等對(duì)象。當(dāng)對(duì)SQL語句進(jìn)行庫緩存這一個(gè)步驟,決定了SQL語句是否需要進(jìn)行硬解析。為了提升SQL的執(zhí)行效率,我們應(yīng)該盡量避免硬解析,因?yàn)樵赟QL執(zhí)行過程中,創(chuàng)建解析樹,生成執(zhí)行計(jì)Oracle中,綁定變量是它的一大特色。綁定變量就是在SQL句中使用變量,通過不同的變量取值來改變SQL舉個(gè)例子,我們可以使用下面的查詢語代1SQL>select*fromyerwhereyer_id=你也可以使用綁定變量代1SQL>select*fromyerwhereyer_id=:這兩個(gè)查詢語句的效率在Oracle中是完全不同的。如果你在查詢yer_id=10001之后,還會(huì)查詢10002、10003之類的數(shù)據(jù),那么每一次查詢都會(huì)創(chuàng)建一個(gè)新的查詢 Oracle的解析工作量。但是這種方式也有缺點(diǎn),使用動(dòng)態(tài)SQL的方式,因?yàn)閰?shù)不同,會(huì)導(dǎo)致SQL的執(zhí)行效率不同,同時(shí)SQL優(yōu)化也 MySQLSQLOracle中采用了共享池來判斷SQL語句是否存在緩存和執(zhí)解析。那么在MySQL中,SQL是如何被執(zhí)行的呢?首先MySQL是典型的C/S架構(gòu),即/Server架構(gòu),服務(wù)器端程序使用的mysqld。整體的MySQL流程如下圖你能看到MySQL由三層組成連接層:客戶端和服務(wù)器端建立連接,客戶端發(fā)送至服務(wù)器端SQL層:對(duì)SQL語句進(jìn)行查詢處其中SQL層與數(shù)據(jù)庫文件的方式無關(guān),我們來看查詢緩存:Server果在查詢緩存中發(fā)現(xiàn)了這條SQL高,所以在MySQL8.0之后就拋棄了這個(gè)功能。解析器:在解析器中對(duì)SQL語句進(jìn)行語法分析、語義分優(yōu)化器:在優(yōu)化器中會(huì)確定SQL語句的執(zhí)行路徑,比如具備權(quán)限就執(zhí)行SQL查詢并返回結(jié)果。在MySQL8.0以你能看到SQL語句在MySQL中的流程是:SQL語句→緩存查詢→解析器→優(yōu)化器→執(zhí)行器。在部分中,MySQL和Oracle執(zhí)行SQL的原理是一樣的。與Oracle不同的是,MySQL的引擎采用了插件的形開源的MySQL還允許開發(fā)人員設(shè)置自己的引擎,下面nnoDB引擎:它是MySL5.5版本之后默認(rèn)的存儲(chǔ)引擎,最大的特點(diǎn)是支持事務(wù)、行級(jí)鎖定、外鍵約束等。MyISAM引擎:在MySQL5.5版本之前是默認(rèn)的存Memory引擎:使用系統(tǒng)內(nèi)存作為介質(zhì),以便得到更快的響應(yīng)速度。不過如果mysqld進(jìn)程,則會(huì)下才使用Memory引擎。NDB引擎:也叫做NDBCluster引擎,主要用于MySQLCluster分布式集群環(huán)境,類似于Oracle的RAC集群。Archive引擎:它有很好的壓縮機(jī)制,用于文件歸需要注意的是,數(shù)據(jù)庫的設(shè)計(jì)在于表的設(shè)計(jì),而在MySQL實(shí)際的數(shù)據(jù)處理需要來選擇引擎,這也是MySQL的強(qiáng)我們剛才了解了SQL句在OracleMySQL的執(zhí)行流程,實(shí)際上完整的Oracle和MySQL結(jié)構(gòu)圖要復(fù)雜得多:如果你只是簡單地把MySQL和Oracle看成數(shù)據(jù)庫管理系最的部分:SQL的執(zhí)行原理。因?yàn)椴煌腄BMS的SQL執(zhí)行原理是相通的,只是在不同的軟件中,各有各的既然一條SQL語句會(huì)經(jīng)歷不同的模塊,那我們就來看下,在不同的模塊中,SQL執(zhí)行所使用的資源(時(shí)間)是怎樣的。下面我來教你如何在MySQL中對(duì)一條SQL語句的執(zhí)首先我們需要看下profiling是否開啟,開啟它可以MySQL收集在SQL執(zhí)行時(shí)所使用的資源情況,命令如下代1mysql>selectprofiling=0表關(guān)閉,我們需要把profiling開,即設(shè)置為1:代1mysql>set然后我們執(zhí)行一個(gè)SQL詢(你可以執(zhí)行任何一個(gè)SQL代1mysql>select*from查看當(dāng)前會(huì)話所產(chǎn)生的所有你會(huì)發(fā)現(xiàn)我們剛才執(zhí)行了兩次查詢,QueryID別為12。如果我們想要獲取上一次查詢的執(zhí)行時(shí)間,可以使代1mysql>show當(dāng)然你也可以查詢指定的QueryID,比如代1mysql>showprofileforquery查詢SQL的執(zhí)行時(shí)間結(jié)果和上面是一樣在8.0版本之后,MySQL不再支持緩存的查詢,原因我在SQL的查詢時(shí)間。你可以使用selectversion()來查看MySQL的版本情況我們在使用SQL的時(shí)候,往往只見樹木,不見森林,不會(huì)貌的角度來理解這個(gè)問題。你能看到不同的RDBMS之間相同的地方,也有不同的地相同的地方在于OracleMySQL是通過解析器→優(yōu)化器→執(zhí)行器這樣的流程來執(zhí)行SQL的。但Oracle和MySQL在進(jìn)行SQL的查詢上面有軟件實(shí)現(xiàn)層面的差異。Oracle提出了共享池的概念,通過共享池來判斷是進(jìn)行軟解析,還是硬解析。而在MySQL中,8.0以后執(zhí)行器的流程,這一點(diǎn)從MySQL中的showprofile里也能看到。同時(shí)MySQL的一大特色就是提供了各種引擎以供選擇,不同的引擎有各自的使用場景,我們可以針對(duì)每張表選擇適合的引擎。今天的內(nèi)容到這里就結(jié)束了,你能說一下Oracle中的綁定變量是什么嗎?使用它有什么優(yōu)缺點(diǎn)嗎?MySQL的擎是一大特色,其中MyISAMInnoDB是常用的引擎,這兩個(gè)搜索引擎的特性和使用場景分別是什最后留一道選擇題吧,解析后的SQL句在Oracle哪個(gè)數(shù)據(jù)緩沖日志緩沖共享大歡迎你在評(píng)論區(qū)寫下你的思考,我會(huì)在評(píng)論區(qū)與你一起交流,如果這篇文章幫你理順了Orae和MySL執(zhí)行L的過程,歡迎你把它給你的朋友或者同事。※注:本篇文章出現(xiàn)的這里大圖 售賣。頁面已增加防盜追蹤,上一 下一 精選留言we置編輯回復(fù):請(qǐng)您點(diǎn)擊這里進(jìn)行FATMAN89置編輯回復(fù):第五篇文章會(huì)給出MyISAM2416Zain2 129缺點(diǎn)是可能會(huì)導(dǎo)致執(zhí)行計(jì)劃不夠優(yōu)化33老師,提個(gè)建議,可以嗎MySQL的引擎是一大特色,其中MyISAM和這里好

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論