MySQL查詢過程是什么

小編給大家分享一下MySQL查詢過程是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創新互聯公司專業為企業提供弋江網站建設、弋江做網站、弋江網站設計、弋江網站制作等企業網站建設、網頁設計與制作、弋江企業網站模板建站服務,十余年弋江做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。

MySQL邏輯架構

MySQL邏輯架構整體分為三層,最上層為客戶層,并非MySQL所獨有,諸如,連接處理、授權認證、安全等功能均在這一層處理。

MySQL大多數核心服務均在中間這一層,包括查詢解析、分析、優化、緩存、內置函數(時間、數學、加密等),所有的跨存儲引擎的功能也在這一層實現:存儲過程、觸發器、視圖等。

最下層為存儲引擎,其負責MySQL中的數據存儲和提取,中間的服務層通過API與存儲引擎通信,這些API接口屏蔽了不同存儲引擎的差異。

MySQL查詢過程

當向MySQL發送一個請求的時候:

MySQL查詢過程是什么

1.客戶端/服務端通信協議

MySQL客戶端/服務端通信協議是“半雙工”的:在任意時刻,要么是服務器向客戶端發送數據,要么是客戶端向服務器發送數據,這兩個動作不能同時發生。一旦一端開始發送消息,另一端要接受完整個消息才能響應它,所以我們無法也無須將一個消息切成小塊獨立發送,也沒有辦法進行流量控制。

客戶端用一個單獨的數據包將查詢請求發送給服務器,所以當查詢語句很長的時候,需要設置max_allowed_packet參數。但是需要的注意的是,如果查詢實在是太大,服務端會拒絕接受更多數據并拋出異常。

與之相反的是,服務器響應給用戶的數據通常會很多,由多個數據包組成。但是當服務器響應客戶端請求時,客戶端必須完整的接受整個返回結果,而不能簡單的只取前面幾條結果,然后讓服務器停止發送。因而在實際開發中,盡量保持查詢簡單且只返回必需的數據,減小通信間數據包的大小和數量是一個非常好的習慣,這也是查詢中盡量避免使用SELECT * 以及加上LIMIT限制的原因之一。

2.查詢緩存

在解析一個查詢語句前,如果查詢緩存是打開的,那么MySQL會檢查這個查詢語句是否命中查詢緩存中的數據。如果當前查詢恰好命中查詢緩存,在檢查一次用戶權限后直接返回緩存中的結果。這種情況下,查詢不會被解析,也不會生成執行計劃,更不會執行。

MySQL將緩存存放在一個引用表(類似于HashMap的數據結構),通過一個哈希值索引,這個哈希值通過查詢本身、當前要查詢的數據庫、客戶端協議版本號等一些可能影響結果的信息計算得來。所以兩個查詢在任何字符上的不同(空格、注釋),都會導致緩存不會命中。

如果查詢中包含任何用戶自定義函數、存儲函數、用戶變量、臨時表、mysql庫中的系統表,其查詢結果都不會被緩存。比如函數NOW()或者CURRENT_DATE()會因為不同的查詢時間,返回不同的查詢結果,再比如包含CURRENT_USER或者CONNECION_ID()的查詢語句會因為不同的用戶而返回不同的結果,將這樣的查詢結果緩存起來沒有任何的意義。

3.緩存失效

MySQL的查詢緩存系統會跟蹤查詢中涉及的每個表,如果這些表(數據或結構)發生變化,那么和這張表相關的所有緩存數據都將失效。正因為如此,在任何的寫操作時,MySQL必須將對應表的所有緩存都設置為失效。如果查詢緩存非常大或者碎片很多,這個操作就可能帶來很大的系統消耗,甚至導致系統僵死一會兒。而且查詢緩存對系統的額外消耗也不僅僅在寫操作,讀操作也不例外:

1.任何的查詢語句在開始之前都必須經過檢查,即使這條SQL語句永遠不會命中緩存

2.如果查詢結果可以被緩存,那么執行完成后,會將結果存入緩存,也會帶來額外的系統消耗

基于此,要知道并不是什么情況下查詢緩存都會提高系統性能,緩存和失效都會帶來額外消耗,只有當緩存帶來的資源節約大于其本身消耗的資源時,才會給系統帶來性能提升。但要如何評估打開緩存是否能夠帶來性能提升是一件非常困難的事情,。如果系統確實存在一些性能問題,可以嘗試打開查詢緩存,并在數據庫設計上做一些優化:比如:

1.用多個小表代替一個大表,注意不要過度設計

2.批量插入代替循環單條插入

3.合理控制緩存空間大小,一般來說其大小設置為幾十兆比較合適

4.可以通過SQL_CACHE和SQL_NO_CACHE來控制某個查詢語句是否需要進行緩存

不要輕易打開查詢緩存,特別是寫密集型應用。如果實在是忍不住,可以將query_cache_type 設置為DEMAND,這時只有加入SQL_CACH的查詢才會走緩存,其他查詢則不會,這樣可以非常自由地控制哪些查詢需要被緩存。

4.語法解析和預處理

MySQL通過關鍵字將SQL語句進行解析,并生成一顆對應的解析樹。這個過程解析器主要通過語法規則來驗證和解析。比如SQL中是否使用了錯誤的關鍵字或者關鍵字的順序是否正確等等。預處理則會根據MySQL規則進一步檢查解析樹是否合法。比如檢查要查詢的數據表和數據列是否存在等等。

5.查詢優化

語法樹被認為是合法之后,并且有優化器將其轉化成查詢計劃,多數情況下,一條查詢可以有很多種執行方式,最后都返回相應的結果,優化器的作用就是找到這其中最好的執行計劃。

MySQL的查詢優化器是一個非常復雜的部件,它使用了非常多的優化策略來生成一個最優的執行計劃:

1.重新定義表的關聯順序(多張表關聯查詢時,并不一定按照SQL中指定的順序進行,但有一些技巧可以指定關聯順序)

2.優化MIN()和MAX()函數(找某列的最小值,如果該列有索引,只需要查找B+Tree索引最左端,反之則可以找到最大值)

3.提前終止查詢(使用Limit時,查找到滿足數量的結果集后會立即終止查詢)

4.優化排序(在老版本MySQL會使用兩次傳輸排序,即先讀取行指針和需要排序的字段在內存中對其排序,然后再根據排序結果去讀取數據行,而新版本采用的是單次傳輸排序,也就是一次讀取所有的數據行,然后根據給定的列排序)

6.查詢執行引擎

在完成解析和優化階段以后,MySQL會生成對應的執行計劃,查詢執行引擎根據執行計劃給出的指令逐步執行得出結果。整個執行過程的大部分操作均是通過調用存儲引擎實現的接口來完成,這些接口被稱為handler API。查詢過程中的每一張表由一個handler實例表示,實際上,MySQL在查詢優化階段就為每一張表創建了一個handler實例,優化器可以根據這些實例的接口來獲取表的相關信息,包括表的所有列名、索引統計信息等。存儲引擎接口提供了非常豐富的功能,但其底層僅有幾十個接口,這些接口像塔積木一樣完成了一次查詢的大部分操作。

7.返回結果給客戶端

查詢執行的最后一個階段就是將結果返回給客戶端。即使查詢不到數據,MySQL仍然會返回這個查詢的相關信息,比如該查詢影響到的行數以及執行時間等等。

如果查詢緩存被打開且這個查詢可以被緩存,MySQL也會將結果存放到緩存中。

結果集返回客戶端是一個增量且逐步返回的過程。有可能MySQL在生成第一條結果時,就開始向客戶端逐步返回結果集了。這樣服務端就無須存儲太多結果而消耗過多內存,也可以讓客戶端第一時間獲得返回結果。需要注意的是,結果集中的每一行都會以一個滿足①中所描述的通信協議的數據包發送,再通過TCP協議進行傳輸,在傳輸過程中,可能對MySQL的數據包進行緩存然后批量發送。

MySQL整個查詢執行過程

1.客戶端向MySQL服務器發送一條查詢請求

2.服務器首先先檢查查詢緩存,如果命中緩存,則立刻返回存儲在緩存中的結果。否則進入下一級段

3.服務器進行SQL解析、預處理、再由優化器生成對應的執行計劃

4.MySQL根據執行計劃,調用存儲引擎的API來執行查詢

以上是MySQL查詢過程是什么的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!

本文標題:MySQL查詢過程是什么
標題鏈接:http://m.kartarina.com/article12/pgodgc.html

成都網站建設公司_創新互聯,為您提供網站設計公司App設計、面包屑導航網站策劃、品牌網站設計、軟件開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

手機網站建設
主站蜘蛛池模板: 无码人妻精品中文字幕免费| 日韩免费人妻AV无码专区蜜桃 | 亚洲AV成人无码久久精品老人| 国产高清无码二区| 日韩午夜福利无码专区a| 国产久热精品无码激情| 无码国模国产在线无码精品国产自在久国产 | 国产三级无码内射在线看| 高清无码v视频日本www| 精品亚洲成α人无码成α在线观看| 国产成人无码区免费网站| 亚洲午夜无码久久| 亚洲AV无码不卡无码| 色欲香天天综合网无码| 亚洲精品无码你懂的| 国产精品ⅴ无码大片在线看| 国产福利无码一区在线| 亚洲av无码电影网| 亚洲中文字幕无码不卡电影| 无码毛片一区二区三区中文字幕| 久久亚洲AV成人无码电影| 亚洲Av综合色区无码专区桃色| 五十路熟妇高熟无码视频| 无码粉嫩虎白一线天在线观看| 无码人妻AV一二区二区三区| 国产亚洲精品无码成人| 国产成人精品无码片区在线观看 | 亚洲∧v久久久无码精品| 久久亚洲精品无码播放| 免费无码国产V片在线观看| 亚洲AV无码专区在线电影成人| 久久精品中文字幕无码绿巨人 | 国产福利电影一区二区三区久久老子无码午夜伦不| 色综合久久无码五十路人妻| 中文字字幕在线中文无码 | 国模无码人体一区二区| 亚洲精品无码你懂的网站| 精品无人区无码乱码毛片国产| 国产精品无码一区二区在线观一| 亚洲Av无码国产情品久久 | 国产精品无码无卡在线观看久|