MySQL-01-MySQL基礎架構

1-MySQL邏輯結構

? ? ? ?如果能在頭腦中構建一幅MySQL各組件之間如何協同工作的架構圖,有助于深入理解MySQL服務器。下圖展示了MySQL的邏輯架構圖。

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

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

? ? ? 最下層為存儲引擎,其負責MySQL中的數據存儲和提取。和Linux下的文件系統類似,每種存儲引擎都有其優勢和劣勢。中間的服務層通過API與存儲引擎通信,這些API接口屏蔽了不同存儲引擎間的差異。

2-MySQL查詢過程

? ? ? ?我們總是希望MySQL能夠獲得更高的查詢性能,最好的辦法是弄清楚MySQL是如何優化和執行查詢的。一旦理解了這一點,就會發現:很多的查詢優化工作實際上就是遵循一些原則讓MySQL的優化器能夠按照預想的合理方式運行而已。

當向MySQL發送一個請求的時候,MySQL到底做了些什么呢?

2.1-客戶端/服務端通信協議

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

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

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

2.2-查詢緩存

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

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

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

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

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

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

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

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

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

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

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

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

? ? ? ?當然查詢緩存系統本身是非常復雜的,這里討論的也只是很小的一部分,其他更深入的話題,比如:緩存是如何使用內存的?如何控制內存的碎片化?事務對查詢緩存有何影響等等,讀者可以自行閱讀相關資料,這里權當拋磚引玉吧。

2.3-語法解析和預處理

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

2.4-查詢優化

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

? ? ? ?MySQL使用基于成本的優化器,它嘗試預測一個查詢使用某種執行計劃時的成本,并選擇其中成本最小的一個。在MySQL可以通過查詢當前會話的last_query_cost的值來得到其計算當前查詢的成本。

mysql> select * from t_message limit 10;
...省略結果集mysql> show status like 'last_query_cost';
+-----------------+-------------+
| Variable_name   | Value       |
+-----------------+-------------+
| Last_query_cost | 6391.799000 |
+-----------------+-------------+

? ? ? 示例中的結果表示優化器認為大概需要做6391個數據頁的隨機查找才能完成上面的查詢。這個結果是根據一些列的統計信息計算得來的,這些統計信息包括:每張表或者索引的頁面個數、索引的基數、索引和數據行的長度、索引的分布情況等等。

? ? ? ?有非常多的原因會導致MySQL選擇錯誤的執行計劃,比如統計信息不準確、不會考慮不受其控制的操作成本(用戶自定義函數、存儲過程)、MySQL認為的最優跟我們想的不一樣(我們希望執行時間盡可能短,但MySQL值選擇它認為成本小的,但成本小并不意味著執行時間短)等等。

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

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

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

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

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

隨著MySQL的不斷發展,優化器使用的優化策略也在不斷的進化,這里僅僅介紹幾個非常常用且容易理解的優化策略,其他的優化策略,大家自行查閱吧。

2.5-查詢執行引擎

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

2.6-返回結果給客戶端

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

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

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

2.7-小結

回頭總結一下MySQL整個查詢執行過程,總的來說分為6個步驟:

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

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

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

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

(5)將結果返回給客戶端,同時緩存查詢結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163366.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jar包打進本地倉庫

jar包打進本地倉庫 <dependency><groupId>com.test</groupId><artifactId>test-api</artifactId><version>1.0.0</version> </dependency>mvn install:install-file -Dfiletest.jar -DgroupIdcom.test -DartifactIdtest-api …

數據結構:鏈表

目錄 一.為什么要使用鏈表存儲數據&#xff1f; 二.鏈表的分類 單向或者雙向鏈表&#xff1a; 帶頭或者不帶頭&#xff1a; 循環或者非循環&#xff1a; 三.鏈表的實現 3.1無頭單向非循環鏈表的實現&#xff1a; 3.1.1單向無頭非循環鏈表的聲明 3.1.2動態申請一個節點 …

kmalloc

kmalloc(size(結構體)*n)就是申請n個大小為結構體的空間&#xff0c;然后返回一個指向這個空間的首地址的指針。這個指針可以看作是一個數組&#xff0c;它的每個元素都是結構體&#xff0c;所以可以使用索引來訪問這個空間的不同部分。例如&#xff0c;如果你有一個指針p&…

python數據類型之字符串、字典、元組

一、數字類型 1、number類型 Python Number 數據類型用于存儲數值。 數據類型是不允許改變的,這就意味著如果改變 Number 數據類型的值&#xff0c;將重新分配內存空間。 以下實例在變量賦值時 Number 對象將被創建&#xff1a; var1 1 var2 10也可以使用del語句刪除一些…

亞馬遜防關聯要注意什么?看這一篇,防關聯有技巧!

亞馬遜賬號關聯的問題&#xff0c;對于跨境電商來說都不陌生&#xff0c;店鋪的安全問題往往和賬號關聯有關&#xff0c;一旦亞馬遜賬號被關聯就很可能導致我們的店鋪被封&#xff0c;對于被亞馬遜封店的賣家都會有申訴機會&#xff0c;如果無法成功申訴&#xff0c;那將永久被…

C語言——利用函數遞歸,編寫函數不允許創建臨時變量,求字符串長度

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int my_strlen(char* str) {if(*str ! \0)return 1my_strlen(str1);elsereturn 0; }int main() {char arr[] "hello";int len my_strlen(arr); //arr是數組&#xff0c;數組傳參&#xff0c;傳過去的是第…

NB水表能承受最大的水壓是多少?

NB水表&#xff0c;作為新一代智能水表&#xff0c;以小巧的體積、穩定的性能和強大的功能贏得了市場的認可。那么&#xff0c;它究竟能承受多大的水壓呢&#xff1f;接下來&#xff0c;小編來為大家揭秘下&#xff0c;一起來看下吧&#xff01; 一、NB水表概述 NB水表&#xf…

安卓手機好用的清單軟件有哪些?

生活中每個人都有丟三落四的習慣&#xff0c;伴隨著生活節奏的加快&#xff0c;人們常忘事的情況會更加頻繁的出現&#xff0c;這時候很多人就開始選擇手機上記錄清單類的軟件&#xff0c;安卓手機在手機市場中占有很大的分量&#xff0c;在安卓手機上好用的記錄清單的軟件有哪…

在高斯DB數據庫中,獲取上個月的日期

個人網站 返回上個月的日期。ADD_MONTHS函數用于對日期進行加減操作&#xff0c;通過將當前日期減去1個月來獲取上個月的日期。請注意&#xff0c;這里使用的是負數來表示減去一個月的時間間隔。 SELECT ADD_MONTHS(CURRENT_DATE, -1) AS last_month;

SiP封裝、合封芯片和芯片合封是一種技術嗎?都是合封芯片技術?

合封芯片、芯片合封和SiP系統級封裝經常被提及的概念。但它們是三種不同的技術&#xff0c;還是同一種技術的不同稱呼&#xff1f;本文將幫助我們更好地理解它們的差異。 一、合封芯片與SiP系統級封裝的定義 首先合封芯片和芯片合封都是一個意思 合封芯片是一種將多個芯片&a…

力扣labuladong——一刷day49

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、力扣513. 找樹左下角的值二、力扣666. 路徑總和 IV三、力扣1261. 在受污染的二叉樹中查找元素四、力扣572. 另一棵樹的子樹 前言 二叉樹的遞歸分為「遍歷」…

【Leetcode每日一題】mid——6. N 字形變換

題目描述 https://leetcode.cn/problems/zigzag-conversion/description/ 將一個給定字符串 s 根據給定的行數 numRows &#xff0c;以從上往下、從左到右進行 Z 字形排列。 比如輸入字符串為 “PAYPALISHIRING” 行數為 3 時&#xff0c;排列如下&#xff1a; 之后&#xff0…

技術細分|推薦系統——推薦系統中的數據去偏方法

本篇的主要脈絡同樣依據中科大何向南教授、合工大汪萌教授聯合在 TKDE 上的一篇綜述文章展開&#xff1a;Bias and Debias in Recommender System: A Survey and Future Directions。 下面按照前導文章中介紹的數據偏差 Selection Bias、Conformity Bias、Exposure Bias、Posit…

PDF添加文字或者圖片

引入依賴 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.4</version> </dependency> <dependency><groupId>org.apache.pdfbox</groupId><artifactI…

找JPG格式圖片的地址(持續更新中)

問題描述&#xff1a;找JPG格式圖片的地址 解決辦法&#xff1a; 第一個 谷歌的images 第二個&#xff0c;搜狗圖片和百度圖片 不過下載是WEBP格式&#xff0c;可以使用一個在線WEBP格式轉JPG格式的在線網站即可。 轉換的網址為&#xff1a; https://ezgif.com/webp-to-j…

【學歷是敲門磚】如果你想有個好的起點,不妨沖一沖計算機考研,這本書將會助你一臂之力

目錄 計算機考研難點 《計算機考研精煉1000題》揭秘問答 1. 為什么是1000題&#xff1f; 2. 有什么優勢&#xff1f; 3. 編寫團隊水平如何&#xff1f; 4. 題目及解析品質如何&#xff1f;可以試讀嗎&#xff1f; 購買鏈接 高質量的學習提升圈子 京東熱賣下單鏈接&…

可視化NGINX管理平臺Nginx Proxy Manager

# for CentOSyum install docker-compose -y# for Ubuntuapt-get install docker-compose -y 如果提示&#xff1a; 沒有可用軟件包 docker-compose&#xff0c; 錯誤&#xff1a;無須任何處理 通過 pip 安裝 docker-compose # 添加企業版附加包 yum -y install epel-rel…

java--static的注意事項

1.使用類方法、實例方法時的幾點注意事項 ①類方法中可以直接訪問類的成員&#xff0c;不可以直接訪問實例成員。 ②實例方法中既可以直接訪問類成員&#xff0c;也可以直接訪問實例成員。 ③實例方法中可以出現this關鍵字&#xff0c;類方法中不可以出現this關鍵字的。

利用工業網關進行設備數采的方法-天拓四方分享

在工業物聯網&#xff08;IIoT&#xff09;中&#xff0c;設備數采是一種關鍵技術&#xff0c;它通過收集、分析和傳輸設備運行過程中的各種數據&#xff0c;為工業制造提供重要的信息和洞察。隨著工業4.0和智能制造的快速發展&#xff0c;工業數據采集和處理已經成為工業物聯網…

甲方使用外包真的能節約成本嗎?

語&#xff1a;外包作為一種常見的業務模式&#xff0c;被廣泛應用于各行各業。然而&#xff0c;甲方在選擇外包時&#xff0c;是否真的能夠實現成本節約呢&#xff1f;本文將從多個角度進行探討。 正文&#xff1a; 降低人力成本&#xff1a;外包通常是將某些業務環節或項目交…