更新時(shí)間:2021-01-13 17:01:07 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1335次
查詢是用戶通過(guò)設(shè)置某些查詢條件,從表或其他查詢中選取全部或者部分?jǐn)?shù)據(jù),以表的形式顯示數(shù)據(jù)供用戶瀏覽。查詢是一個(gè)獨(dú)立的、功能強(qiáng)大的、具有計(jì)算功能和條件檢索功能的數(shù)據(jù)庫(kù)對(duì)象。MySQL數(shù)據(jù)庫(kù)中,MySQL查詢同樣是數(shù)據(jù)庫(kù)的核心操作,下面我們一起來(lái)看看MySQL查詢執(zhí)行過(guò)程分為那幾個(gè)步驟?
一、執(zhí)行一個(gè)查詢過(guò)程概述
1.客戶端發(fā)送一條查詢給服務(wù)器;
2.服務(wù)器先檢查查詢緩存,如果命中了緩存,則立即返回存儲(chǔ)在緩存中的結(jié)果。否則進(jìn)入下一階段;
3.服務(wù)器端進(jìn)行SQL解析、預(yù)處理,再由優(yōu)化器生成對(duì)應(yīng)的執(zhí)行計(jì)劃;
4.MySQL根據(jù)優(yōu)化器生成的執(zhí)行計(jì)劃,調(diào)用存儲(chǔ)引擎的API來(lái)執(zhí)行查詢;
5.將結(jié)果返回給客戶端;
二、查詢緩存
1.查詢緩存保存查詢返回的完整結(jié)構(gòu);
2.命中查詢緩存時(shí),MySQL會(huì)立即返回結(jié)果,跳過(guò)解析、優(yōu)化和執(zhí)行階段;
3.查詢緩存系統(tǒng)會(huì)跟蹤查詢中設(shè)計(jì)的每個(gè)表,如果這些表發(fā)生變化,和這個(gè)表相關(guān)的所有緩存數(shù)據(jù)都將失效;
4.判斷緩存是否命中時(shí),不會(huì)進(jìn)行解析查詢語(yǔ)句,直接使用MySQL語(yǔ)句和客戶端發(fā)送過(guò)來(lái)的其他原始信息,任何字符上的不同,例如空格、注解等,都會(huì)導(dǎo)致緩存不命中;
5.當(dāng)查詢語(yǔ)句有一些不確定的數(shù)據(jù)時(shí),則不會(huì)被緩存;
6.查詢緩存配置參數(shù)
三、語(yǔ)法解析器和預(yù)處理器
1.MySQL解析器通過(guò)關(guān)鍵字將SQL語(yǔ)句進(jìn)行解析,并生成對(duì)應(yīng)的解析樹;
2.MySQL解析器將使用MySQL語(yǔ)法規(guī)則驗(yàn)證和解析查詢,eg:驗(yàn)證是否使用錯(cuò)誤的關(guān)鍵字、使用關(guān)鍵字的順序是否正確、驗(yàn)證引號(hào)是否前后匹配等;
3.預(yù)處理器根據(jù)一些MySQL規(guī)則進(jìn)行進(jìn)一步檢查解析樹是否合法,eg:檢查數(shù)據(jù)表和數(shù)據(jù)列是否存在,解析名字和別名是否有歧義;
4.下一步預(yù)處理器驗(yàn)證用戶權(quán)限,查看用戶是否有操作權(quán)限,通常很快;
四、查詢優(yōu)化器
1.優(yōu)化器的作用就是找到最好的執(zhí)行計(jì)劃;
2.語(yǔ)法樹被認(rèn)為是合法后,優(yōu)化器將MySQL語(yǔ)句轉(zhuǎn)換為執(zhí)行計(jì)劃,一條查詢可以有多種執(zhí)行方式,最后都返回相同的結(jié)果;
3.生成執(zhí)行計(jì)劃過(guò)程
4.MySQL使用基于成本的優(yōu)化器(CBO cost-based optimizer),會(huì)預(yù)測(cè)一個(gè)查詢使用某種執(zhí)行計(jì)劃的成本,選擇其中成本最小的一個(gè);
5.導(dǎo)致MySQL優(yōu)化器選擇非最優(yōu)執(zhí)行計(jì)劃的原因
6.MySQL可以處理的優(yōu)化類型
五、查詢執(zhí)行引擎
1.查詢執(zhí)行引擎根據(jù)執(zhí)行計(jì)劃來(lái)完成整個(gè)查詢;
2.執(zhí)行計(jì)劃是一個(gè)數(shù)據(jù)結(jié)構(gòu)(指令樹),不是和其他關(guān)系型數(shù)據(jù)庫(kù)那樣生成對(duì)應(yīng)的字節(jié)碼;
3.mysql根據(jù)執(zhí)行計(jì)劃給出的指令逐步執(zhí)行,在執(zhí)行過(guò)程中,有大量的操作需要調(diào)用存儲(chǔ)引擎實(shí)現(xiàn)的接口來(lái)完成,這些接口即為“handler API”;
4.查詢中每一個(gè)表由一個(gè)handler的實(shí)例表示。在優(yōu)化階段mysql就為每一個(gè)表創(chuàng)建了一個(gè)handler實(shí)例,優(yōu)化器可以根據(jù)這些實(shí)例的接口獲取表的相關(guān)信息,eg:列名、索引、統(tǒng)計(jì)信息等;
六、返回客戶端結(jié)果
1.如果查詢可以被緩存,mysql會(huì)在這個(gè)階段將結(jié)果存放到查詢緩存中;
2.mysql將結(jié)果集返回給客戶端是一個(gè)增量逐步返回的過(guò)程,在查詢生成第一條結(jié)果時(shí),mysql就可以開始向客戶端逐步返回結(jié)果了;
3.增量逐步返回的好處:服務(wù)端無(wú)須存儲(chǔ)太多的結(jié)果,不會(huì)因?yàn)榉祷靥嗟慕Y(jié)果而消耗太多內(nèi)存;同時(shí)讓客戶端第一時(shí)間獲得返回結(jié)果;
4.結(jié)果集中的每一行都會(huì)以一個(gè)滿足mysql客戶端/服務(wù)端通信協(xié)議的包發(fā)送,再通過(guò)tcp協(xié)議進(jìn)行傳輸,傳輸過(guò)程中,可能對(duì)mysql的包進(jìn)行緩存然后批量傳輸;
從以上內(nèi)容可以看出MySQL查詢執(zhí)行過(guò)程包括6個(gè)方面的內(nèi)容,這6個(gè)方向缺一不可,當(dāng)然在MySQL數(shù)據(jù)庫(kù)中,SQL語(yǔ)言提供了SELECT語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的查詢,該語(yǔ)句具有靈活的使用方式和豐富的功能。MySQL數(shù)據(jù)庫(kù)中,各種各樣的查詢語(yǔ)句也是十分重要的考點(diǎn),小伙伴們可以在本站的MySQL教程中找到許多面試題,在學(xué)習(xí)的同時(shí)還能隨時(shí)檢驗(yàn)自己的能力,何樂(lè)而不為!
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743