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