mysql結構和執行流程

2022-07-15 13:24:15 字數 3110 閱讀 8979

mysql整體結構大致分三層:

mysql客戶端:用來處理 連線處理,授權認證,安全等功能

核心服務層:用來查詢解析,分析,優化,快取,內建函式(如時間、數學、加密等函式)所有的跨儲存引擎的功能也在這一層實現:儲存過程、觸發器、檢視。

儲存引擎:負責mysql中的資料儲存和提取,每種儲存引擎都有其優勢和劣勢。核心服務層通過api與儲存引擎通訊,這些api介面遮蔽不同儲存引擎間的差異。

mysql server邏輯架構:

詳細結構可分為:

連線池元件

管理服務和工具元件

sql介面元件

查詢分析器元件

優化器元件

緩衝元件

外掛程式事儲存引擎

物理檔案

儲存引擎是基於表的 不是基於資料庫。

理解:mysql分為mysql server層和儲存引擎層,在server層中又分為連線層和sql層

連線層:客戶端或應用程式通過介面連線sql,最先連線處理的就是連線層,

連線層包括通訊協議,執行緒處理,使用者名稱密碼認證三個部分,

通訊協議負責檢測客戶端版本是否與服務端相容,執行緒處理是指每個連線請求都會分配乙個對應對立的執行緒,使用者密碼認證建立的賬號和密碼,以及host主機授權是都可以連線到 mysql伺服器。

sql層

sql層包含許可權判斷,查詢快取,解析器,預處理,查詢優化器,快取和執行計畫

1> 許可權判斷可以通過審核使用者有沒有訪問某個庫,某個表,或者表裡某行的許可權。

2> 查詢快取通過query cache進行操作,如果資料在query cache中,則直接返回結果給客戶端。

3> 查詢解析器針對sql語句進行解析,判斷語法是否正確,並生成解析器。

4> 預處理器解決解析器無法解析的語義。

5> 優化器對sql語句進行改寫和相應的優化,例如對連線表重排序,對外連線轉內連線,代數等價法則,計算和減少常量表示式,自查詢優化,早期終結,相等傳遞等,並生成最優的執行計畫,然後就餓可以呼叫程式的api介面,通過儲存引擎層訪問資料。

儲存引擎層:

innodb儲存引擎:支援事務

innodb儲存引擎將資料放在乙個邏輯表空間中,這個表空間就行黑盒一樣由innodb儲存引擎自身進 行管理,從mysql4.1版本開始,他可以將每個innodb儲存引擎的表單獨存放到乙個獨立的ibd檔案 中,此外,innodb儲存引擎支援用裸裝置來建立其表空間。 innodb儲存引擎通過使用多版本併發控制(mvcc)來獲得高併發性,並且實現了sql標準的4中隔離級 別,預設為rr級別,同時,使用一種被稱為next-key locking的策略來避免幻讀現象的產生,除此 之外,innodb儲存引擎還提供了插入快取,二次寫入,自適應hash索引,預讀等高效能和高可用的 功能。對於表中的資料儲存,innodb儲存引擎採用聚集的方式,因此每張表的儲存都是按主鍵的順 序進行存放,如果沒有顯示在表定義時指定主鍵,innodb儲存引擎會為每一行生成乙個6位元組的 rowid,並以此作為主鍵。

myisam儲存引擎:不支援事務,支援全文索引,但不用。myisam儲存引擎的另乙個與眾不同的地方是它的緩衝池只快取索引檔案,而不是緩衝 資料檔案。myisam儲存引擎表由myd和myi組成,myd用來存放資料檔案,myi用來存放索引檔案。

mysql 整個查詢執行過程,總的來說分為 5 個步驟 :

客戶端向 mysql 伺服器傳送一條查詢請求

伺服器首先檢查查詢快取,如果命中快取,則立刻返回儲存在快取中的結果,否則進入下一階段

伺服器進行 sql解析、預處理、再由優化器生成對應的執行計畫

mysql 根據執行計畫,呼叫儲存引擎的 api來執行查詢

將結果返回給客戶端,同時快取查詢結果

針對查詢快取的理解:

在解析乙個查詢語句前,如果查詢快取是開啟的,那麼 mysql 會檢查這個查詢語句是否命中查詢快取中的 資料。如果當前查詢恰好命中查詢快取,在檢查一次使用者許可權後直接返回快取中的結果。這種情況下,查 詢不會被解析,也不會生成執行計畫,更不會執行。mysql將快取存放在乙個引用表 (不要理解成table,可 以認為是類似於 hashmap 的資料結構),通過乙個雜湊值索引,這個雜湊值通過查詢本身、當前要查詢的 資料庫、客戶端協議版本號等一些可能影響結果的資訊計算得來。所以兩個查詢在任何字元上的不同 (例如 : 空格、注釋),都會導致快取不會命中。如果查詢中包含任何使用者自定義函式、儲存函式、使用者變數、臨時表、mysql庫中的系統表,其查詢結果 都不會被快取。比如函式 now() 或者 current_date() 會因為不同的查詢時間,返回不同的查詢結果,再 比如包含 current_user 或者 connecion_id() 的查詢語句會因為不同的使用者而返回不同的結果,將這樣 的查詢結果快取起來沒有任何的意義

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

任何的查詢語句在開始之前都必須經過檢查,即使這條 sql語句 永遠不會命中快取

如果查詢結果可以被快取,那麼執行完成後,會將結果存入快取,也會帶來額外的系統消耗

基於此,並不是什麼情況下查詢快取都會提高系統效能,快取和失效都會帶來額外消耗,特別是寫密集型 應用,只有當快取帶來的資源節約大於其本身消耗的資源時,才會給系統帶來效能提公升。可以嘗試開啟查 詢快取,並在資料庫設計上做一些優化 :

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

批量插入代替迴圈單條插入

合理控制快取空間大小,一般來說其大小設定為幾十兆比較合適

可以通過 sql_cache 和 sql_no_cache 來控制某個查詢語句是否需要進行快取

注 : sql_no_cache 是禁止快取查詢結果,但並不意味著 是 cache 不作為結果返回給 不 query,之前的 , 快取結果之後也可以查詢到

可以在 select 語句中指定查詢快取的選項,對於那些肯定要實時的從表中獲取資料的查詢,或者對於那些 一天只執行一次的查詢,都可以指定不進行查詢快取,使用 sql_no_cache 選項。對於那些變化不頻繁的 表,查詢操作很固定,可以將該查詢操作快取起來,這樣每次執行的時候不實際訪問表和執行查詢,只是 從快取獲得結果,可以有效地改善查詢的效能,使用 sql_cache 選項

檢視開啟快取情況

MySQL執行流程

最近也在面試,被問到了資料庫優化的一些問題 廢話不多說開始吧 了解mysql優化,那麼我們就先從mysql的執行流程開始說吧 客戶端訪問資料庫 查詢快取 有之則直接返回 解析 語法解析,生成解析樹,處理器,生成新解析樹 查詢優化器 執行計畫 查詢執行引擎 返回結果 下面我們開始講一下每乙個步驟吧 1...

Mysql執行流程

檢視快取情況 show status like qcache 可檢視快取情況 查詢快取 不會快取的情況 1 當查詢語句中有一些不確定的資料時,則不會被快取。如包含函式now current date 等類似的函式,或者使用者自定義的函式,儲存函式,使用者變數等都不會被快取 2 當查詢的結果大於que...

Mysql執行流程

啟動1.1 客戶端通過命令啟動mysql 1.2 呼叫初始化模組,對系統環境變數 快取 儲存引擎進行初始化 連線2.1 通過網路互動,使用者傳送一條sql會傳遞到連線管理模組,然後 到連線進 執行緒模組 2.2 通過使用者模組校驗使用者是否有訪問資料庫許可權 2.3 檢驗通過後到執行緒連線池檢視是否...