mysql怎么查看全部數(shù)據(jù) mysql:一條SQL查詢語句是如何執(zhí)行的?
mysql:一條SQL查詢語句是如何執(zhí)行的?本篇文章會分析下一個sql語句在MySQL中的執(zhí)行流程,以及sql的查詢在MySQL內(nèi)部會怎么吞吐,sql語句的更新是怎么完成的。在總結(jié)之前我會先面帶你看看
mysql:一條SQL查詢語句是如何執(zhí)行的?
本篇文章會分析下一個sql語句在MySQL中的執(zhí)行流程,以及sql的查詢在MySQL內(nèi)部會怎么吞吐,sql語句的更新是怎么完成的。
在總結(jié)之前我會先面帶你看看MySQL的基礎(chǔ)架構(gòu),明白了MySQL由那些組件分成巳經(jīng)這些組件的作用是什么,可以不好處我們再理解和可以解決這些問題。
一MySQL基礎(chǔ)架構(gòu)總結(jié)1.1MySQL基本都架構(gòu)概覽
下圖是MySQL的一個作分析架構(gòu)圖,從下圖你也可以很清晰的見到用戶的SQL語句在MySQL內(nèi)部是該如何不能執(zhí)行的。
先簡單啊能介紹下下圖牽涉到的一些組件的基本上作用好處大家解釋這幅圖,在1.2節(jié)中會祥細推薦到這些組件的作用。
連接器:身份認證和權(quán)限相關(guān)(登入MySQL的時候)。網(wǎng)站查詢緩存:執(zhí)行查詢語句的時候,會先網(wǎng)上查詢緩存(MySQL8.0版本后移除,是因為這個功能不太實用點)。結(jié)論器:也沒物理命中緩存的話,SQL語句變會經(jīng)分析器,分析器說白了那是要先看你的SQL語句要干什么,再系統(tǒng)檢查你的SQL語句語法是否正確。優(yōu)化軟件器:通過MySQL如果說最優(yōu)的方案去執(zhí)行。執(zhí)行器:執(zhí)行語句,然后從存儲引擎趕往數(shù)據(jù)。
簡單的說MySQL主要注意統(tǒng)稱Server層和存儲引擎層:
Server層:主要注意和連接器、網(wǎng)上查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,所有跨存儲引擎的功能都在這一層實現(xiàn)程序,.例如存儲過程、觸發(fā)器、視圖,函數(shù)等,有一個沒限制的日志模塊binglog日志模塊。存儲引擎:比較多共同負責數(shù)據(jù)的存儲和無法讀取,常規(guī)也可以全部替換的插件式架構(gòu),接受InnoDB、MyISAM、Memory等多個存儲引擎,其中InnoDB引擎有自有的日志模塊redolog模塊?,F(xiàn)在最常用的存儲引擎是InnoDB,它從MySQL5.5.5版本開始就被當做設(shè)置成存儲引擎了。1.2Server層基本組件可以介紹
1)連接器
連接器主要注意和身份認證和權(quán)限相關(guān)的功能相關(guān),就君不見一個級別很高的門衛(wèi)差不多。
通常共同負責用戶登錄數(shù)據(jù)庫,通過用戶的身份認證,除了校驗賬戶密碼,權(quán)限等你的操作,如果沒有用戶賬戶密碼已通過,連接器會到權(quán)限表中去查詢該用戶的所有權(quán)限,之后在這個連接里的權(quán)限邏輯判斷都是會感情依賴此時讀取文件到的權(quán)限數(shù)據(jù),也就是說,妖軍如果能這個再連接不時開,無需管理員改了該用戶的權(quán)限,該用戶也是不受影響的。
2)去查詢緩存(MySQL8.0版本后移除)
查詢緩存主要為了緩存我們所執(zhí)行的SELECT語句在內(nèi)該語句的結(jié)果集。
連接確立后,負責執(zhí)行查詢語句的時候,會先可以查詢緩存,MySQL會先校檢這個sql是否是負責執(zhí)行過,以Key-Value的形式緩存在內(nèi)存中,Key是查詢估計,Value是結(jié)果集。如果不是緩存key被命中,變會真接趕往給客戶端,假如還沒有爆擊,可能會不能執(zhí)行妖軍的操作,完成后也會把結(jié)果緩存出聲,方便些下兩次內(nèi)部函數(shù)。肯定在真正的負責執(zhí)行緩存可以查詢的時候還是會校驗用戶的權(quán)限,是否有該表的查詢條件。
MySQL網(wǎng)上查詢不個人建議可以使用緩存,只不過查詢緩存失效在實際業(yè)務(wù)場景中可能會太不穩(wěn)定,假如你對一個表更新的話,這個表上的所有的查詢緩存都會被數(shù)據(jù)清空。對此不經(jīng)常更新完的數(shù)據(jù)來說,不使用緩存肯定可以不的。
因此,一般在大多數(shù)情況下我們是不推薦推薦去可以使用查詢緩存的。
MySQL8.0版本后刪除了緩存的功能,官方也其實該功能在實際中的應(yīng)用場景也很少,所以才乾脆然后刪除了。
3)分析器
MySQL沒有爆擊緩存,這樣的話都會再次進入分析什么器,分析器要注意是用來分析SQL語句是來干,分析器也會可分幾步:
準備,詞法分析,一條SQL語句有多個字符串橫列,簡單的方法要提取關(guān)鍵字,例如select,給出去查詢的表,提出字段名,做出網(wǎng)站查詢條件等等。交了任務(wù)這些操作后,可能會進入到第二步。
第二步,語法分析,比較多那是確認你鍵入的sql是否真確,如何確定條件符合MySQL的語法。
成功這2步之后,MySQL就準備好就開始先執(zhí)行了,可是要如何不能執(zhí)行,怎摸不能執(zhí)行是建議的結(jié)果呢?這時候就必須系統(tǒng)優(yōu)化器能上場了。
4)優(yōu)化器
系統(tǒng)優(yōu)化器的作用就是它如果說的更優(yōu)的執(zhí)行方案去負責執(zhí)行(有時侯很有可能也又不是最優(yōu),這篇文章涉及對這部分知識的深入解釋),例如多個索引的時候該怎么中,選擇索引,多表查詢的時候要如何選擇類型關(guān)聯(lián)順序等。
的確,當經(jīng)過了系統(tǒng)優(yōu)化器之后也算這個語句具體詳細該怎么先執(zhí)行就巳經(jīng)定下來。
5)執(zhí)行器
當你選擇了執(zhí)行方案后,MySQL就準備著又開始不能執(zhí)行了,是需要先執(zhí)行前會校驗該用戶有沒有權(quán)限,如果不是沒有權(quán)限,可能會回出錯信息,如果不是有權(quán)限,變會去全局函數(shù)引擎的接口,返回接口負責執(zhí)行的結(jié)果。
二語句分析2.1查詢語句
說了以上這樣多,那你也不知一條sql語句是該如何執(zhí)行的呢?不過我們的sql可以兩類兩種,一種是網(wǎng)站查詢,一種是可以更新(提升,自動更新,刪出)。我們先分析什么下查詢語句,語句追加:
select*acrosstb_studentAwherebecause張三
增強上面的說明,我們講下這個語句的執(zhí)行流程:
先系統(tǒng)檢查該語句有無有權(quán)限,假如沒有權(quán)限,然后直接返回出現(xiàn)錯誤信息,假如有權(quán)限,在MySQL8.0版本以前,會先網(wǎng)上查詢緩存,以這條sql語句為key在內(nèi)存中查詢是否是有結(jié)果,假如有再緩存,如果不是沒有,不能執(zhí)行下一步。實際分析器通過詞法分析什么,提純sql語句的關(guān)鍵元素,諸如再提取上面這個語句是查詢select,分離提取是需要網(wǎng)站查詢的表名為tb_student,要網(wǎng)上查詢所有的列,可以查詢條件是這個表的id1。后再判斷這個sql語句如何確定有語法錯誤,.例如關(guān)鍵詞是否是錯誤的等等,如果沒有檢查沒問題啊就想執(zhí)行下一步。接下來就是優(yōu)化軟件器參與判斷想執(zhí)行方案,上面的sql語句,這個可以有兩種想執(zhí)行方案:
a.先網(wǎng)上查詢學(xué)生表中姓名為“張三”的學(xué)生,后再確定如何確定年齡是18。b.先判斷學(xué)生中年齡18歲的學(xué)生,后再再查詢姓名為“張三”的學(xué)生。
那你優(yōu)化軟件器依據(jù)什么自己的優(yōu)化算法參與選擇先執(zhí)行效率最好就是的一個方案(系統(tǒng)優(yōu)化器認為,有時候不一定會最好就是)。那你去確認了想執(zhí)行計劃后就馬上準備就開始負責執(zhí)行了。
進行權(quán)限校驗,如果不是沒有權(quán)限可能會回錯誤信息,如果不是有權(quán)限變會動態(tài)創(chuàng)建數(shù)據(jù)庫引擎接口,前往引擎的執(zhí)行結(jié)果。
2.2可以更新語句
以上那是一條去查詢sql的執(zhí)行流程,那么接下來的事情我們看下一條更新語句如何執(zhí)行的呢?sql語句萬分感謝:
setuptb_studentAsetwhere張三
我們來給張三改下年齡,在求實際數(shù)據(jù)庫那肯定絕對不會系統(tǒng)設(shè)置年齡這個字段的,要不要被技術(shù)負責人打的。其實條語句也基本是會沿著那條上三個查詢的流程走,但執(zhí)行可以更新的時候肯定要記錄日志啦,這都會化入日志模塊了,MySQL從網(wǎng)上下載的日志模塊式binlog(歸檔日志),所有的存儲引擎都是可以在用,我們廣泛的InnoDB引擎還那個軟件了一個日志模塊redolog(系統(tǒng)重裝日志),我們就以InnoDB模式過去探討這個語句的執(zhí)行流程。流程不勝感激:
先去查詢到張三這一條數(shù)據(jù),要是有緩存,又是會會用到緩存。然后拿去網(wǎng)上查詢的語句,把age轉(zhuǎn)成19,然后把全局函數(shù)引擎API 接口,寫入到這一行數(shù)據(jù),InnoDB引擎把數(shù)據(jù)保存到在內(nèi)存中,另外資料記錄redolog,此時redolog直接進入prepare狀態(tài),接著告知執(zhí)行器,負責執(zhí)行結(jié)束了,即將是可以再提交。執(zhí)行器收到通知后記錄信息binlog,接著調(diào)用引擎接口,并提交redolog為提交狀態(tài)。自動更新結(jié)束。這里那肯定有同學(xué)會問,為啥要用兩個日志模塊,用一個日志模塊要不嗎?
這是而且最就開始MySQL并沒與InnoDB引擎(InnoDB引擎是其他公司以插件形式插到MySQL的),MySQL光盤驅(qū)動的引擎是MyISAM,但是我們很清楚redolog是InnoDB引擎特殊的,其他存儲引擎都就沒,這就可能導(dǎo)致會還沒有panic-safe的能力(attack-safe的能力就算是數(shù)據(jù)庫突然發(fā)生十分重起,前的重新提交的記錄都應(yīng)該不會丟了),binlog日志只有單獨歸檔。
并又不是說只用一個日志模塊是可以,只是InnoDB引擎那是通過redolog來接受事務(wù)的。那就,又會有同學(xué)問,我用兩個日志模塊,但千萬不能這么說復(fù)雜行不行啊,為什么不redolog要引導(dǎo)出prepare預(yù)再提交狀態(tài)?這里我們用反證法來說明下之所以?
先寫redolog然后重新提交,然后再寫binlog,題中寫了一半redolog后,機器掛了,binlog日志是沒有被寫入,這樣機器關(guān)機重啟后,這臺機器會通過redolog復(fù)原數(shù)據(jù),但是而現(xiàn)在bingog完全沒有資料記錄該數(shù)據(jù),后續(xù)通過機器備份文件的時候,就會丟了這一條數(shù)據(jù),同樣的主從歌詞同步也會弄丟這一條數(shù)據(jù)。先寫binlog,然后把寫redolog,題中開始寫了binlog,機器十分重啟后了,而沒有redolog,本機是根本無法復(fù)原這一條記錄的,可是binlog又有記錄,那么和上面同樣的道理,可能會再產(chǎn)生數(shù)據(jù)不相符的情況。要是按結(jié)構(gòu)redolog兩階段遞交的就不一樣的了,寫完binglog后,然后把再提交redolog就會避兔又出現(xiàn)上述事項的問題,使可以保證了數(shù)據(jù)的一致性。那你今天來聊一聊,有沒有一個極度的情況呢?假設(shè)redolog處于預(yù)并提交狀態(tài),binglog也早寫完了,這時候再一次發(fā)生了極其重啟后會怎么樣啊呢?這個就要依賴性太強于MySQL的處理機制了,MySQL的處理過程萬分感謝:
推測redolog是否是完整,假如確定是求全部的,就立玄提交。要是redolog只不過是預(yù)并提交但不是commit狀態(tài),這個時候是會去確認binlog有無完整,如果完整就并提交redolog,不完整就事務(wù)回滾事務(wù)。這樣的就幫忙解決了數(shù)據(jù)一致性的問題。
三總結(jié)歸納MySQL主要分成三類Server曾和引擎層,Server層通常除了連接器、網(wǎng)上查詢緩存、分析器、360優(yōu)化器、執(zhí)行器,另外另外一個日志模塊(binlog),這個日志模塊所有執(zhí)行引擎都是可以共用,redolog只有InnoDB有。引擎層是插件式的,目前主要注意除開,MyISAM,InnoDB,Memory等。查詢語句的執(zhí)行流程萬分感謝:權(quán)限校驗(如果不是命中緩存)---》去查詢緩存---》分析什么器---》系統(tǒng)優(yōu)化器---》權(quán)限校驗---》執(zhí)行器---》引擎更新語句執(zhí)行流程追加:分析什么器----》權(quán)限校驗----》執(zhí)行器---》引擎---redolog(prepare狀態(tài)---》binlog---》redolog(commit狀態(tài))
MySQL數(shù)據(jù)庫查看數(shù)據(jù)表占用空間大小和記錄數(shù)的方法?
1.
想查看hx庫的所有表大小,也可以不使用:SELECTTABLE_NAME,DATA_LENGTHINDEX_LENGTH,TABLE_ROWSacrossinformation_...
2.
想一欄hx庫的comfortable表大小,可以不使用:SELECTDATA_LENGTHINDEX_LENGTH,TABLE_ROWS FROM information_ WHERE...