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