深入理解:Mysql執(zhí)行SQL語(yǔ)句過程

深入理解:Mysql執(zhí)行SQL語(yǔ)句過程

 

楚雄州網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

開發(fā)人員基本都知道,我們的數(shù)據(jù)存在數(shù)據(jù)庫(kù)中(目前最多的是MySQL和oracle,由于作者更擅長(zhǎng)mysql,所以這里默認(rèn)數(shù)據(jù)庫(kù)為mysql),服務(wù)器通過sql語(yǔ)句將查詢數(shù)據(jù)的請(qǐng)求傳入到mysql數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)拿到sql語(yǔ)句以后。都是進(jìn)行了哪些操作呢?這里向大家介紹下我的個(gè)人的理解,歡迎大家評(píng)論區(qū)批評(píng)指正。

流程概述

mysql得到sql語(yǔ)句后,大概流程如下:

1.sql的解析器:負(fù)責(zé)解析和轉(zhuǎn)發(fā)sql

2.預(yù)處理器:對(duì)解析后的sql樹進(jìn)行驗(yàn)證

3.查詢優(yōu)化器:得到一個(gè)執(zhí)行計(jì)劃

4.查詢執(zhí)行引擎:得到數(shù)據(jù)結(jié)果集

5.將數(shù)據(jù)放回給調(diào)用端。

流程圖如下所示:

深入理解:Mysql執(zhí)行SQL語(yǔ)句過程

 

分發(fā)器及緩存階段

首先,如果系統(tǒng)的緩存功能開啟著的話,sql語(yǔ)句進(jìn)入mysql后,sql進(jìn)行判斷,是否為select關(guān)鍵字。如果是,那么先去查詢緩存中進(jìn)行查詢,如果在查詢緩存中可以命中sql語(yǔ)句,那么直接返回查詢緩存中的查詢語(yǔ)句對(duì)應(yīng)的value值(在緩存中,把查詢語(yǔ)句做一個(gè)hash運(yùn)算,結(jié)果作為key值,查詢的結(jié)果集為value)。

如果命中緩存的話,查詢速度是相當(dāng)快的。但是查詢緩存也有它相應(yīng)的缺點(diǎn)。

首先,開啟緩存的話,服務(wù)器會(huì)消耗大量的內(nèi)存空間;其次,緩存有的時(shí)候并不適用;最后,有的情況下,開啟緩存也不會(huì)將對(duì)應(yīng)的sql語(yǔ)句寫入緩存。

緩存不適用的情況:

緩存的鎖的力度比較大,而且對(duì)于動(dòng)態(tài)sql的支持度不夠。

緩存在數(shù)據(jù)進(jìn)行更新的時(shí)候,是進(jìn)行的表級(jí)鎖,更新結(jié)束后,會(huì)把所有與更新內(nèi)容相關(guān)的緩存全部刪除。所以,如果表的寫入比較多的話,緩存是比較浪費(fèi)性能的。如果寫入特別多,可能緩存反而會(huì)導(dǎo)致mysql變慢。

查詢不到緩存的情況:

1.查詢條件有不確定數(shù)據(jù):如now ,current_time等。

2.緩存對(duì)大小寫敏感,如select * from test 和SELECT* FROM test 就不會(huì)解析為同一條sql

查詢帶來的額外開銷:

1.開始前需要先檢查緩存是否命中。

2.結(jié)果輸出的時(shí)候,需要額外進(jìn)行數(shù)據(jù)的緩存操作。

3.寫入數(shù)據(jù)時(shí),mysql會(huì)將對(duì)應(yīng)表的所有緩存都設(shè)置為失效。當(dāng)緩存內(nèi)存較大的時(shí)候,會(huì)導(dǎo)致系統(tǒng)消耗較大。

sql的解析器與預(yù)處理

sql解析器是在命令分發(fā)之后,將對(duì)應(yīng)的sql語(yǔ)句,解析為sql解析樹。sql解析樹是Mysql本身內(nèi)部的語(yǔ)法規(guī)則和解析查詢。驗(yàn)證是否使用錯(cuò)誤的關(guān)鍵字,sql語(yǔ)法順序是否正確等。(語(yǔ)法層面的錯(cuò)誤)

解析完成后,進(jìn)行查詢語(yǔ)句預(yù)處理器,根據(jù)mysql的規(guī)則,檢查解析樹是否合法。(表格是否存在,別名是否有歧義等)

查詢優(yōu)化器

查詢優(yōu)化器獲取到執(zhí)行計(jì)劃然后由查詢執(zhí)行引擎執(zhí)行相應(yīng)的操作。查詢優(yōu)化器,是數(shù)據(jù)庫(kù)l的一個(gè)核心模塊,分為cbo和rbo兩種。

其中,rbo是基于規(guī)則的優(yōu)化器。(rbo在oracle早期版本中使用,現(xiàn)在也保留,不過默認(rèn)為cbo。mysql沒有rbo優(yōu)化器)

這些規(guī)則是硬編碼在數(shù)據(jù)庫(kù)的代碼中的。rbo會(huì)根據(jù)輸入的sql語(yǔ)句可以匹配到的優(yōu)先級(jí)最高的規(guī)則去作為執(zhí)行計(jì)劃。例如:在rbo中有這么一條規(guī)則:有索引的情況下,使用索引。那么所有的帶有索引的表在執(zhí)行的時(shí)候,都會(huì)走索引。rbo最大的問題在于,通過固定規(guī)則來決定執(zhí)行計(jì)劃。并不會(huì)考慮sql中涉及的對(duì)象的數(shù)量和分布。有可能選出來的規(guī)則不是最優(yōu)的執(zhí)行計(jì)劃。

cbo 是基于成本的優(yōu)化器(基于統(tǒng)計(jì)信息),從目標(biāo)諸多的執(zhí)行路徑中選擇一個(gè)成本最小的執(zhí)行路徑來作為執(zhí)行計(jì)劃。成本指的是mysql根據(jù)相關(guān)的統(tǒng)計(jì)信息,算出來sql語(yǔ)句對(duì)應(yīng)的io,cpu等的消耗的一個(gè)估計(jì)值。計(jì)算過程涉及到索引、表、行等數(shù)據(jù),過程比較復(fù)雜。

1.查詢優(yōu)化器使用統(tǒng)計(jì)信息為sql選擇執(zhí)行計(jì)劃。

2.mysql沒有數(shù)據(jù)直方圖,也無法手工刪除統(tǒng)計(jì)信息。(oracle有)

3.在服務(wù)器曾有查詢優(yōu)化器,卻沒有保存數(shù)據(jù)和索引統(tǒng)計(jì)信息。統(tǒng)計(jì)信息由存儲(chǔ)引擎實(shí)現(xiàn),不同的存儲(chǔ)引擎會(huì)存儲(chǔ)不同的統(tǒng)計(jì)信息。

4.統(tǒng)計(jì)信息分為索引的統(tǒng)計(jì)信息和表的統(tǒng)計(jì)信息。

查看統(tǒng)計(jì)信息

索引統(tǒng)計(jì)信息

show index from table 或information_schema.statistics表

表統(tǒng)計(jì)信息

show table status like 或 information_schema.tables表

查詢執(zhí)行引擎+返回?cái)?shù)據(jù)給客戶端

得到執(zhí)行計(jì)劃后,根據(jù)已有的執(zhí)行計(jì)劃,查詢執(zhí)行引擎,mysql的SQL Layer層,調(diào)用Storage Engine Layer層的接口,從mysql的存儲(chǔ)引擎中獲取到相對(duì)應(yīng)的結(jié)果集,然后返回給用戶。

執(zhí)行完成后,將結(jié)果返回給客戶端,如果是查詢語(yǔ)句,并且開啟了緩存,那么,mysql會(huì)同時(shí)將結(jié)果集放到查詢緩存中。然后將查到的結(jié)果集返回。如果是增刪改操作,那么返回執(zhí)行語(yǔ)句后受影響的行數(shù)。

順便給大家推薦一個(gè)Java架構(gòu)方面的交流學(xué)習(xí)群: 698581634 ,里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識(shí)體系,主要針對(duì)Java開發(fā)人員提升自己,突破瓶頸,相信你來學(xué)習(xí),會(huì)有提升和收獲。在這個(gè)群里會(huì)有你需要的內(nèi)容  朋友們請(qǐng)抓緊時(shí)間加入進(jìn)來吧。

分享標(biāo)題:深入理解:Mysql執(zhí)行SQL語(yǔ)句過程
瀏覽路徑:http://bm7419.com/article42/giggec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、品牌網(wǎng)站設(shè)計(jì)、Google、建站公司、網(wǎng)站設(shè)計(jì)ChatGPT

廣告

聲明:本網(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)

成都網(wǎng)站建設(shè)公司