linux怎么在mysql執(zhí)行sql語(yǔ)句 mysql:一條SQL查詢語(yǔ)句是如何執(zhí)行的?
mysql:一條SQL查詢語(yǔ)句是如何執(zhí)行的?本篇文章會(huì)分析下一個(gè)sql語(yǔ)句在MySQL中的執(zhí)行流程,包括sql的查詢?cè)贛ySQL內(nèi)部會(huì)怎摸光芒閃爍,sql語(yǔ)句的更新是怎么成功的。在總結(jié)之前我會(huì)先跟著你
mysql:一條SQL查詢語(yǔ)句是如何執(zhí)行的?
本篇文章會(huì)分析下一個(gè)sql語(yǔ)句在MySQL中的執(zhí)行流程,包括sql的查詢?cè)贛ySQL內(nèi)部會(huì)怎摸光芒閃爍,sql語(yǔ)句的更新是怎么成功的。
在總結(jié)之前我會(huì)先跟著你看一下MySQL的基礎(chǔ)架構(gòu),清楚了MySQL由那些組件混編已經(jīng)這些組件的作用是什么,可以不幫我們表述和可以解決這些問(wèn)題。
一MySQL基礎(chǔ)架構(gòu)分析1.1MySQL基本架構(gòu)概覽
下圖是MySQL的一個(gè)作分析架構(gòu)圖,從下圖你可以很清晰的注意到用戶的SQL語(yǔ)句在MySQL內(nèi)部是要如何執(zhí)行的。
先很簡(jiǎn)單推薦一下下圖比較復(fù)雜的一些組件的基本上作用好處大家表述這幅圖,在1.2節(jié)中會(huì)祥細(xì)詳細(xì)介紹到這些組件的作用。
連接器:身份認(rèn)證和權(quán)限具體(登陸MySQL的時(shí)候)。網(wǎng)上查詢緩存:執(zhí)行查詢語(yǔ)句的時(shí)候,會(huì)先去查詢緩存(MySQL8.0版本后移除,只不過(guò)這個(gè)功能不太實(shí)惠)。分析器:就沒(méi)物理命中緩存的話,SQL語(yǔ)句是會(huì)經(jīng)由分析器,分析器說(shuō)白了應(yīng)該是要先看你的SQL語(yǔ)句要干什么,再檢查一下你的SQL語(yǔ)句語(yǔ)法是否正確。360優(yōu)化器:聽從MySQL其實(shí)最優(yōu)的方案去先執(zhí)行。執(zhí)行器:執(zhí)行語(yǔ)句,后再?gòu)拇鎯?chǔ)引擎前往數(shù)據(jù)。
簡(jiǎn)單來(lái)說(shuō)MySQL要注意兩類Server層和存儲(chǔ)引擎層:
Server層:通常包括連接器、可以查詢緩存、分析器、360優(yōu)化器、執(zhí)行器等,所有跨存儲(chǔ)引擎的功能都在這一層利用,例如存儲(chǔ)過(guò)程、觸發(fā)器、視圖,函數(shù)等,有一個(gè)可以修的日志模塊binglog日志模塊。存儲(chǔ)引擎:比較多你們負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和讀取文件,需要可以修改成的插件式架構(gòu),支持InnoDB、MyISAM、Memory等多個(gè)存儲(chǔ)引擎,其中InnoDB引擎有自有的日志模塊redolog模塊?,F(xiàn)在最常用的存儲(chǔ)引擎是InnoDB,它從MySQL5.5.5版本結(jié)束就被當(dāng)做設(shè)置存儲(chǔ)引擎了。1.2Server層都差不多組件介紹
1)連接器
連接器要注意和身份認(rèn)證和權(quán)限相關(guān)的功能去相關(guān),就再則一個(gè)級(jí)別很高的門衛(wèi)差不多。
主要注意負(fù)責(zé)用戶登錄數(shù)據(jù)庫(kù),并且用戶的身份認(rèn)證,除開校驗(yàn)賬戶密碼,權(quán)限等操作,如果用戶賬戶密碼已是從,連接器會(huì)到權(quán)限表中網(wǎng)上查詢?cè)撚脩舻乃袡?quán)限,之后在這個(gè)連接里的權(quán)限邏輯判斷全是會(huì)依賴感此時(shí)讀取文件到的權(quán)限數(shù)據(jù),也就是說(shuō),強(qiáng)盜團(tuán)如果這個(gè)再連接斷的開,立即管理員可以修改了該用戶的權(quán)限,該用戶都是不受影響的。
2)查詢緩存(MySQL8.0版本后移除)
網(wǎng)站查詢緩存比較多用來(lái)緩存我們所負(fù)責(zé)執(zhí)行的SELECT語(yǔ)句以及該語(yǔ)句的結(jié)果集。
直接連接確立后,執(zhí)行查詢語(yǔ)句的時(shí)候,會(huì)先可以查詢緩存,MySQL會(huì)先校驗(yàn)這個(gè)sql是否是先執(zhí)行過(guò),以Key-Value的形式緩存在內(nèi)存中,Key是網(wǎng)上查詢最遲,Value是結(jié)果集。要是緩存key被暴擊命中,變會(huì)真接趕往給客戶端,要是是沒(méi)有命中等級(jí),是會(huì)不能執(zhí)行強(qiáng)盜團(tuán)的操作,完成后也會(huì)把結(jié)果緩存過(guò)來(lái),更方便下第二次動(dòng)態(tài)鏈接庫(kù)。其實(shí)在能夠想執(zhí)行緩存去查詢的時(shí)候應(yīng)該會(huì)校驗(yàn)用戶的權(quán)限,如何確定有該表的查詢條件。
MySQL可以查詢不個(gè)人建議不使用緩存,是因?yàn)椴樵兙彺娼K止在換算業(yè)務(wù)場(chǎng)景中可能會(huì)會(huì)更加正常,假如你對(duì)一個(gè)表更新的話,這個(gè)表上的所有的查詢緩存都會(huì)被清空。對(duì)于不你經(jīng)常更新的數(shù)據(jù)來(lái)說(shuō),使用緩存那就可以不的。
所以我,像是在大多數(shù)情況下我們都是不推薦推薦去使用查詢緩存的。
MySQL8.0版本后刪除了緩存的功能,官方也懷疑該功能在換算的應(yīng)用場(chǎng)景比較好少,因?yàn)榍嗾娼觿h除掉了。
3)分析器
MySQL沒(méi)有命中緩存,這樣的話就會(huì)直接進(jìn)入分析什么器,分析器主要是用處講SQL語(yǔ)句是來(lái)干什么啊的,分析器也會(huì)兩類幾步:
最先,詞法分析,一條SQL語(yǔ)句有多個(gè)字符串混編,首先要分離提取關(guān)鍵字,比如tablename,提出去查詢的表,提出來(lái)字段名,做出查詢條件等等。完了以后這些操作后,就會(huì)再次進(jìn)入第二步。
第二步,語(yǔ)法分析,主要就是可以確定你然后輸入的sql是否錯(cuò)誤的,是否需要要什么MySQL的語(yǔ)法。
能完成這2步之后,MySQL就準(zhǔn)備著就開始先執(zhí)行了,不過(guò)要如何執(zhí)行,怎末執(zhí)行是最好的結(jié)果呢?而現(xiàn)在就要優(yōu)化系統(tǒng)器替補(bǔ)隊(duì)員了。
4)優(yōu)化器
360優(yōu)化器的作用那就是它懷疑的最優(yōu)化的執(zhí)行方案去想執(zhí)行(有時(shí)很可能也不是什么最優(yōu),這篇文章涉及對(duì)這部分知識(shí)的深入解說(shuō)),比如多個(gè)索引的時(shí)候該要如何你選索引,多表可以查詢的時(shí)候怎么中,選擇關(guān)聯(lián)順序等。
無(wú)疑,經(jīng)由了優(yōu)化軟件器之后可以說(shuō)這個(gè)語(yǔ)句具體該如何能想執(zhí)行就巳經(jīng)定下去。
5)執(zhí)行器
當(dāng)選擇了執(zhí)行方案后,MySQL就準(zhǔn)備好結(jié)束執(zhí)行了,必須先執(zhí)行前會(huì)校驗(yàn)該用戶有沒(méi)有權(quán)限,如果不是沒(méi)有權(quán)限,可能會(huì)前往錯(cuò)誤`信息,假如有權(quán)限,是會(huì)去內(nèi)部函數(shù)引擎的接口,直接返回接口想執(zhí)行的結(jié)果。
二語(yǔ)句講2.1查詢語(yǔ)句
說(shuō)了以上這么大多,這樣也不知一條sql語(yǔ)句是如何不能執(zhí)行的呢?其實(shí)我們的sql是可以統(tǒng)稱兩種,一種是去查詢,一種是更新(減少,更新,刪除)。我們先講下查詢語(yǔ)句,語(yǔ)句追加:
select*returningtb_studentAwherebut張三
增強(qiáng)上面的說(shuō)明,我們總結(jié)下這個(gè)語(yǔ)句的執(zhí)行流程:
先檢查該語(yǔ)句是否是有權(quán)限,要是沒(méi)有權(quán)限,然后直接返回錯(cuò)誤`信息,假如有權(quán)限,在MySQL8.0版本以前,會(huì)先可以查詢緩存,以這條sql語(yǔ)句為key在內(nèi)存中網(wǎng)上查詢是否有結(jié)果,假如有再緩存,假如沒(méi)有,想執(zhí)行第二步。分析器參與詞法講,分離提取sql語(yǔ)句的重要元素,諸如提純上面這個(gè)語(yǔ)句是去查詢select,再提取必須去查詢的表名為tb_student,不需要網(wǎng)站查詢所有的列,網(wǎng)站查詢條件是這個(gè)表的id1。然后把確認(rèn)這個(gè)sql語(yǔ)句是否需要有語(yǔ)法錯(cuò)誤,.例如關(guān)鍵詞如何確定錯(cuò)誤的等等,如果沒(méi)有檢查絕對(duì)沒(méi)問(wèn)題就執(zhí)行接下來(lái)。這一次就是系統(tǒng)優(yōu)化器并且判斷不能執(zhí)行方案,上面的sql語(yǔ)句,可以不有兩種執(zhí)行方案:
a.先可以查詢學(xué)生表中姓名為“張三”的學(xué)生,后再確定是否年齡是18。b.先找出學(xué)生中年齡18歲的學(xué)生,然后把再可以查詢姓名為“張三”的學(xué)生。
那么優(yōu)化系統(tǒng)器依據(jù)自己的優(yōu)化算法進(jìn)行你選先執(zhí)行效率最好就是的一個(gè)方案(優(yōu)化軟件器以為,有時(shí)候不肯定會(huì)最好就是)。那你去確認(rèn)了負(fù)責(zé)執(zhí)行計(jì)劃后就準(zhǔn)備著開始先執(zhí)行了。
參與權(quán)限校驗(yàn),假如沒(méi)有權(quán)限都會(huì)返回錯(cuò)誤信息,如果有權(quán)限變會(huì)調(diào)用數(shù)據(jù)庫(kù)引擎接口,直接返回引擎的執(zhí)行結(jié)果。
2.2沒(méi)更新語(yǔ)句
以上應(yīng)該是一條查詢sql的執(zhí)行流程,那你這一次我們看下一條沒(méi)更新語(yǔ)句該如何想執(zhí)行的呢?sql語(yǔ)句::
updatetb_studentAsetwhere張三
我們來(lái)給張三如何修改下年齡,在求實(shí)際數(shù)據(jù)庫(kù)估計(jì)應(yīng)該不會(huì)設(shè)置中年齡這個(gè)字段的,要不要被技術(shù)負(fù)責(zé)人打的。反正條語(yǔ)句也基本是會(huì)沿著上三個(gè)網(wǎng)站查詢的流程走,不過(guò)負(fù)責(zé)執(zhí)行更新完的時(shí)候當(dāng)然要記錄日志啦,這都會(huì)分解重組日志模塊了,MySQL隨機(jī)軟件的日志模塊式binlog(歸檔日志),所有的存儲(chǔ)引擎都也可以不使用,我們常用的InnoDB引擎還隨機(jī)軟件了一個(gè)日志模塊redolog(重做一次日志),我們就以InnoDB模式下去繼續(xù)探討這個(gè)語(yǔ)句的執(zhí)行流程。流程::
先可以查詢到張三這一條數(shù)據(jù),如果有緩存,都是會(huì)都用到緩存。然后再拿到去查詢的語(yǔ)句,把a(bǔ)ge中改19,然后把動(dòng)態(tài)創(chuàng)建引擎API 接口,寫入到這一行數(shù)據(jù),InnoDB引擎把數(shù)據(jù)保存在內(nèi)存中,同樣資料記錄redolog,此時(shí)redolog直接進(jìn)入prepare狀態(tài),然后把提醒執(zhí)行器,執(zhí)行完成了,時(shí)刻這個(gè)可以遞交。執(zhí)行器發(fā)來(lái)通知后記錄binlog,接著內(nèi)部函數(shù)引擎接口,再提交redolog為遞交狀態(tài)。更新能完成。這里肯定有同學(xué)會(huì)問(wèn),為什么要用兩個(gè)日志模塊,用一個(gè)日志模塊再不行嗎?
這是是因?yàn)樽铋_始MySQL并沒(méi)與InnoDB引擎(InnoDB引擎是其他公司以插件形式插入MySQL的),MySQL從網(wǎng)上下載的引擎是MyISAM,可是我們清楚redolog是InnoDB引擎濃重的,其他存儲(chǔ)引擎都還沒(méi)有,這就可能導(dǎo)致會(huì)是沒(méi)有fault-safe的能力(attack-safe的能力況且數(shù)據(jù)庫(kù)再一次發(fā)生極其重新啟動(dòng),前遞交的記錄都肯定不會(huì)全部丟失),binlog日志只有用處歸檔。
并不是什么說(shuō)只用一個(gè)日志模塊好像不行,只不過(guò)InnoDB引擎應(yīng)該是通過(guò)redolog來(lái)接受事務(wù)的。這樣的話,又會(huì)有同學(xué)問(wèn),我用兩個(gè)日志模塊,不過(guò)不要這么急切行不行的話,為什么redolog要核心中prepare預(yù)再提交狀態(tài)?這里我們用反證法來(lái)那就證明下為甚么?
先寫redolog真接并提交,然后寫binlog,舉例開始寫redolog后,機(jī)器掛了,binlog日志還沒(méi)有被寫入到,那你機(jī)器重新啟動(dòng)后,這臺(tái)機(jī)器會(huì)實(shí)際redolog復(fù)原數(shù)據(jù),可是這時(shí)候bingog并沒(méi)有留下記錄該數(shù)據(jù),現(xiàn)并且機(jī)器備分的時(shí)候,是會(huì)丟失的這一條數(shù)據(jù),同樣的主從同步也會(huì)丟了這一條數(shù)據(jù)。先寫binlog,然后把寫redolog,假設(shè)不成立沒(méi)寫完了binlog,機(jī)器異樣重啟后了,導(dǎo)致沒(méi)有redolog,本機(jī)是不能復(fù)原這一條記錄的,不過(guò)binlog又有記錄,這樣和上面同樣的道理,都會(huì)再產(chǎn)生數(shù)據(jù)不相符的情況。如果沒(méi)有按結(jié)構(gòu)redolog兩階段提交的就不差不多了,寫了一半binglog后,后再再重新提交redolog可能會(huì)以免出現(xiàn)根據(jù)上述規(guī)定的問(wèn)題,進(jìn)而能保證了數(shù)據(jù)的一致性。那么今天來(lái)聊一聊,有沒(méi)有一個(gè)走極端的情況呢?假設(shè)不成立redolog在預(yù)遞交狀態(tài),binglog也已經(jīng)沒(méi)寫完了,而現(xiàn)在突然發(fā)生了極其重新啟動(dòng)會(huì)咋樣呢?這個(gè)就要依戀于MySQL的處理機(jī)制了,MySQL的處理過(guò)程追加:
確認(rèn)redolog有無(wú)完整,要是可以確定是完整的,就立刻重新提交。要是redolog只是預(yù)并提交但不是commit狀態(tài),這會(huì)兒就會(huì)去確認(rèn)binlog有無(wú)求下載,假如完整就提交redolog,不完整就自動(dòng)回滾事務(wù)。這樣的就可以解決了數(shù)據(jù)一致性的問(wèn)題。
三總結(jié)MySQL比較多可分Server曾和引擎層,Server層要注意和連接器、可以查詢緩存、分析器、系統(tǒng)優(yōu)化器、執(zhí)行器,而有一個(gè)日志模塊(binlog),這個(gè)日志模塊所有執(zhí)行引擎都也可以共用,redolog唯有InnoDB有。引擎層是插件式的,目前主要和,MyISAM,InnoDB,Memory等。查詢語(yǔ)句的執(zhí)行流程::權(quán)限校驗(yàn)(如果沒(méi)有暴擊命中緩存)---》查詢緩存---》結(jié)論器---》優(yōu)化系統(tǒng)器---》權(quán)限校驗(yàn)---》執(zhí)行器---》引擎更新語(yǔ)句執(zhí)行流程萬(wàn)分感謝:總結(jié)器----》權(quán)限校驗(yàn)----》執(zhí)行器---》引擎---redolog(prepare狀態(tài)---》binlog---》redolog(commit狀態(tài))
如何用php調(diào)用mysql中的數(shù)據(jù)?
差不多的基本是流程::
直接連接數(shù)據(jù)庫(kù),再加一個(gè)判斷。
選擇數(shù)據(jù)庫(kù)
加載表
輸出低表中數(shù)據(jù)
下面是代碼:
$conmysql_connect(