搜尋
首頁資料庫mysql教程mysql怎麼運作的
mysql怎麼運作的May 25, 2019 pm 05:57 PM
mysql

MySQL邏輯架構

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

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

最下層為儲存引擎,其負責MySQL中的資料儲存和擷取,中間的服務層透過API與儲存引擎通信,這些API介面屏蔽了不同儲存引擎的差異。

mysql怎麼運作的

MySQL查詢流程

#當向MySQL傳送一個要求的時候:

mysql怎麼運作的

1.客戶端/服務端通訊協定

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

客戶端用一個單獨的資料包將查詢請求傳送給伺服器,所以當查詢語句很長的時候,需要設定max_allowed_pa​​cket參數。但是要注意的是,如果查詢實在太大,服務端會拒絕接受更多資料並拋出例外。

與之相反的是,伺服器回應給使用者的資料通常會很多,由多個資料包組成。但是當伺服器回應客戶端請求時,客戶端必須完整的接受整個回傳結果,而不能簡單的只取前面幾個結果,然後讓伺服器停止發送。因而在實際開發中,盡量保持查詢簡單且只返回必需的數據,減小通信間數據包的大小和數量是一個非常好的習慣,這也是查詢中盡量避免使用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怎麼運作的的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中