品牌型號(hào):華為MateBook D15
榆陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
系統(tǒng):Windows 11
select語句執(zhí)行的結(jié)果是表。select語句目的,就是從數(shù)據(jù)庫檢索,統(tǒng)計(jì),輸出數(shù)據(jù)。select 語句的執(zhí)行過程,根據(jù)查詢的內(nèi)容數(shù)據(jù),組成一個(gè)結(jié)果集,然后用表的形式返回。所以執(zhí)行結(jié)果是一張表。
select語句的執(zhí)行流程:
1、通過客戶端/服務(wù)器通信協(xié)議與MySQL建立連接。
2、查詢緩存,這是 MySQL的一個(gè)可優(yōu)化查詢的地方,如果開啟了Query Cache且在查詢緩存過程中查詢到完全相同的SQL語句,則將查詢結(jié)果直接返回給客戶端;如果沒有開啟Query Cache或者沒有查詢到完全相同的SQL語句則會(huì)由解析器進(jìn)行語法語義解析,并生成解析樹。
3、預(yù)處理器生成新的解析樹。
4、查詢優(yōu)化器生成執(zhí)行計(jì)劃。
5、查詢執(zhí)行引擎執(zhí)行SQL語句,此時(shí)查詢執(zhí)行引擎會(huì)根據(jù)SQL語句中表的存儲(chǔ)引擎類型,以及對(duì)應(yīng)的API接口與底層存儲(chǔ)引擎緩存或者物理文件的交互情況,得到查詢結(jié)果,由MySQL Server過濾后將查詢結(jié)果緩存并返回給客戶端。若開啟了Query Cache,這時(shí)也會(huì)將SQL語句和結(jié)果完整地保存到Query Cache中,以后若有相同的SQL語句執(zhí)行則直接返回結(jié)果。
查詢緩存中的好嗎?是不是要開啟查詢緩存呢?其實(shí)不建議開啟查詢緩存,原因是緩存失效非常頻繁,只要表更新了,緩存就會(huì)失效。所以對(duì)于那些更新操作多的表來說簡(jiǎn)直是災(zāi)難,除非是靜態(tài)表,所以在mysql8中已經(jīng)將查詢緩存取消了。
這是因?yàn)閟ql操作涉及的表不一定只有sql語句中的那些,要在執(zhí)行器階段才能確認(rèn)。
如果表 T 中沒有字段 k,而你執(zhí)行了這個(gè)語句 select * from T
where k=1, 那肯定是會(huì)報(bào)“不存在這個(gè)列”的錯(cuò)誤: “Unknown column ‘k’ in
‘where clause’”。你覺得這個(gè)錯(cuò)誤是在我們上面提到的哪個(gè)階段報(bào)出來的呢?
答 :分析器階段,在分析器階段解析器會(huì)解析sql語句生成一顆解析樹,判斷表時(shí)候存在,列字段是否存在等。
查詢緩存:
只有當(dāng)查詢的語句完全一致(通過哈希查詢實(shí)現(xiàn),大小區(qū)分)才會(huì)命中,命中后直接檢查用戶權(quán)限,之后直接返回?cái)?shù)據(jù)給客戶端
查詢優(yōu)化處理:
語法解析和預(yù)處理:根據(jù)SQL生成語法解析樹,并解析語法錯(cuò)誤,預(yù)處理器檢查解析樹是否存在數(shù)據(jù)上的錯(cuò)誤
查詢優(yōu)化器:選擇最好的執(zhí)行計(jì)劃,包括對(duì)語句的優(yōu)化,對(duì)關(guān)聯(lián)順序的優(yōu)化,使用索引等
查詢執(zhí)行引擎:
相較查詢處理優(yōu)化階段,執(zhí)行引擎階段僅是將執(zhí)行計(jì)劃利用存儲(chǔ)引擎提供的接口執(zhí)行,并不復(fù)雜!
1.當(dāng)我們請(qǐng)求mysql服務(wù)器的時(shí)候,MySQL前端會(huì)有一個(gè)監(jiān)聽,請(qǐng)求到了之后,服務(wù)器得到相關(guān)的SQL語句,執(zhí)行之前(虛線部分為執(zhí)行),還會(huì)做權(quán)限的判斷
2.通過權(quán)限之后,SQL就到MySQL內(nèi)部,他會(huì)在查詢緩存中,看該SQL有沒有執(zhí)行過,如果有查詢過,則把緩存結(jié)果返回,說明在MySQL內(nèi)部,也有一個(gè)查詢緩存.但是這個(gè)查詢緩存,默認(rèn)是不開啟的,這個(gè)查詢緩存,和我們的Hibernate,Mybatis的查詢緩存是一樣的,因?yàn)椴樵兙彺嬉骃QL和參數(shù)都要一樣,所以這個(gè)命中率是非常低的(沒什么卵用的意思)。
3.如果我們沒有開啟查詢緩存,或者緩存中沒有找到對(duì)應(yīng)的結(jié)果,那么就到了解析器,解析器主要對(duì)SQL語法進(jìn)行解析
4.解析結(jié)束后就變成一顆解析樹,這個(gè)解析樹其實(shí)在Hibernate里面也是有的,大家回憶一下,在以前做過Hibernate項(xiàng)目的時(shí)候,是不是有個(gè)一個(gè)antlr.jar。這個(gè)就是專門做語法解析的工具.因?yàn)樵贖ibernate里面有HQL,它就是通過這個(gè)工具轉(zhuǎn)換成SQL的,我們編程語言之所以有很多規(guī)范、語法,其實(shí)就是為了便于這個(gè)解析器解析,這個(gè)學(xué)過編譯原理的應(yīng)該知道.
5.得到解析樹之后,不能馬上執(zhí)行,這還需要對(duì)這棵樹進(jìn)行預(yù)處理,也就是說,這棵樹,我沒有經(jīng)過任何優(yōu)化的樹,預(yù)處理器會(huì)這這棵樹進(jìn)行一些預(yù)處理,比如常量放在什么地方,如果有計(jì)算的東西,把計(jì)算的結(jié)果算出來等等...
6.預(yù)處理完畢之后,此時(shí)得到一棵比較規(guī)范的樹,這棵樹就是要拿去馬上做執(zhí)行的樹,比起之前的那棵樹,這棵得到了一些優(yōu)化
7.查詢優(yōu)化器,是MySQL里面最關(guān)鍵的東西,我們寫任何一條SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它會(huì)怎么去執(zhí)行?它是先執(zhí)行username = toby還是password = 1?每一條SQL的執(zhí)行順序查詢優(yōu)化器就是根據(jù)MySQL對(duì)數(shù)據(jù)統(tǒng)計(jì)表的一些信息,比如索引,比如表一共有多少數(shù)據(jù),MySQL都是有緩存起來的,在真正執(zhí)行SQL之前,他會(huì)根據(jù)自己的這些數(shù)據(jù),進(jìn)行一個(gè)綜合的判定,判斷這一次在多種執(zhí)行方式里面,到底選哪一種執(zhí)行方式,可能運(yùn)行的最快.這一步是MySQL性能中,最關(guān)鍵的核心點(diǎn),也是我們的優(yōu)化原則.我們平時(shí)所講的優(yōu)化SQL,其實(shí)說白了,就是想讓查詢優(yōu)化器,按照我們的想法,幫我們選擇最優(yōu)的執(zhí)行方案,因?yàn)槲覀儽萂ySQL更懂我們的數(shù)據(jù).MySQL看數(shù)據(jù),僅僅只是自己收集到的信息,這些信息可能是不準(zhǔn)確的,MySQL根據(jù)這些信息選了一個(gè)它自認(rèn)為最優(yōu)的方案,但是這個(gè)方案可能和我們想象的不一樣.
8.這里的查詢執(zhí)行計(jì)劃,也就是MySQL查詢中的執(zhí)行計(jì)劃,比如要先執(zhí)行username = toby還是password = 1
9.這個(gè)執(zhí)行計(jì)劃會(huì)傳給查詢執(zhí)行引擎,執(zhí)行引擎選擇存儲(chǔ)引擎來執(zhí)行這一份傳過來的計(jì)劃,到磁盤中的文件中去查詢,這個(gè)時(shí)候重點(diǎn)來了,影響這個(gè)查詢性能最根本的原因是什么?就是硬盤的機(jī)械運(yùn)動(dòng),也就是我們平時(shí)熟悉的IO,所以一條查詢語句是快還是慢,就是根據(jù)這個(gè)時(shí)間的IO來確定的.那怎么執(zhí)行IO又是什么來確定的?就是傳過來的這一份執(zhí)行計(jì)劃.(優(yōu)化就是制定一個(gè)我們認(rèn)為最快的執(zhí)行方案,最節(jié)省IO,和執(zhí)行最快)
10.如果開了查詢緩存,則返回結(jié)果給客戶端,并且查詢緩存也放一份。
標(biāo)題名稱:mysql怎么生成解析樹 mysql樹形結(jié)構(gòu)sql查詢
分享地址:http://www.chinadenli.net/article46/doojshg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站導(dǎo)航、移動(dòng)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、搜索引擎優(yōu)化、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)