1. 程式人生 > >Mysql(一)-----mysql執行機制

Mysql(一)-----mysql執行機制

Mysql執行機制

全面瞭解mysql的執行機制,從而瞭解當前系統的瓶頸,找到優化方案。

借用一張圖
在這裡插入圖片描述
從上圖可以清晰看出mysql的內部架構,可以清楚的看到Mysql是由連線池Connection Pool,SQL介面,解析器,優化器,快取,儲存引擎組成的。

  1. Connectors

指的是不同語言中與SQL的互動

  1. Management Serveices & Utilities:

系統管理和控制工具

  1. Connection Pool: 連線池

管理緩衝使用者連線,執行緒處理等需要快取的需求。
負責監聽對 MySQL Server 的各種請求,接收連線請求,轉發所有連線請求到執行緒管理模組。每一個連線上 MySQL Server 的客戶端請求都會被分配(或建立)一個連線執行緒為其單獨服務。而連線執行緒的主要工作就是負責 MySQL Server 與客戶端的通訊,
接受客戶端的命令請求,傳遞 Server 端的結果資訊等。執行緒管理模組則負責管理維護這些連線執行緒。包括執行緒的建立,執行緒的 cache 等。

  1. SQL Interface: SQL介面

接受使用者的SQL命令,並且返回使用者需要查詢的結果。比如select from就是呼叫SQL Interface

  1. Parser: 解析器。

SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的指令碼。
在 MySQL中我們習慣將所有 Client 端傳送給 Server 端的命令都稱為 query ,在 MySQL Server 裡面,連線執行緒接收到客戶端的一個 Query 後,會直接將該 query 傳遞給專門負責將各種 Query 進行分類然後轉發給各個對應的處理模組。
主要功能:
a . 將SQL語句進行語義和語法的分析,分解成資料結構,然後按照不同的操作型別進行分類,然後做出針對性的轉發到後續步驟,以後SQL語句的傳遞和處理就是基於這個結構的。
b. 如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的

  1. Optimizer: 查詢優化器

SQL語句在查詢之前會使用查詢優化器對查詢進行優化。就是優化客戶端請求的 query(sql語句) ,根據客戶端請求的 query 語句,和資料庫中的一些統計資訊,在一系列演算法的基礎上進行分析,得出一個最優的策略,告訴後面的程式如何取得這個 query 語句的結果
他使用的是“選取-投影-聯接”策略進行查詢。
用一個例子就可以理解: select uid,name from user where gender = 1;
這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以後再進行gender過濾
這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾
將這兩個查詢條件聯接起來生成最終查詢結果

  1. Cache和Buffer: 查詢快取。

他的主要功能是將客戶端提交 給MySQL 的 Select 類 query 請求的返回結果集 cache 到記憶體中,與該 query 的一個 hash 值 做
一個對應。該 Query 所取資料的基表發生任何資料的變化之後, MySQL 會自動使該 query 的Cache 失效。在讀寫比例非常高的應用系統中, Query Cache 對效能的提高是非常顯著的。當然它對記憶體的消耗也是非常大的。
如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料。這個快取機制是由一系列小快取組成的。比如表快取,記錄快取,key快取,許可權快取等

  1. 儲存引擎介面

儲存引擎介面模組可以說是 MySQL 資料庫中最有特色的一點了。目前各種資料庫產品中,基本上只有 MySQL 可以實現其底層資料儲存引擎的外掛式管理。這個模組實際上只是 一個抽象類,但正是因為它成功地將各種資料處理高度抽象化,才成就了今天 MySQL 可插拔儲存引擎的特色。
從圖2還可以看出,MySQL區別於其他資料庫的最重要的特點就是其外掛式的表儲存引擎。MySQL外掛式的儲存引擎架構提供了一系列標準的管理和服務支援,這些標準與儲存引擎本身無關,可能是每個資料庫系統本身都必需的,如SQL分析器和優化器等,而儲存引擎是底層物理結構的實現,每個儲存引擎開發者都可以按照自己的意願來進行開發。
注意:儲存引擎是基於表的,而不是資料庫

  1. 讀寫鎖

在處理併發讀或寫時,可以通過實現一個由兩種型別的鎖組成的鎖系統來解決問題。這兩種型別的鎖通常被稱為共享鎖或和排他鎖,也叫讀鎖和寫鎖
讀鎖是共享的,或者說是相互不阻塞的。多個客戶在同一時刻可以同時讀取同一個資源而不相互干擾
寫鎖是排他的,一個寫鎖會阻塞其他的寫鎖和讀鎖,
Mysql鎖的內部管理是透明的

  1. 鎖粒度

一種提高共享資源併發性的方式就是讓鎖定物件更有選擇性。儘量只鎖定需要修改的部分資料,而不是所有的資源。更理想的方式是,只對會修改的資料片進行精確的鎖定。在給定的資源上,鎖定的資料量越少,則系統的併發程度越高。所謂的鎖策略,就是在鎖的開銷和資料的安全性之間尋求平衡。下面將介紹兩種最重要的鎖策略。

表鎖
表鎖的Mysql中最基本的鎖策略,並且是開銷最小的策略。它會鎖定整張表,一個使用者在對錶進行寫操作前,需要先獲取寫鎖,這會阻塞其他使用者對該表的所有讀寫操作。

行級鎖
行級鎖可以最大程度地支援併發處理(同時也帶來了最大的鎖開銷),行級鎖只在儲存引擎層實現,而Mysql伺服器層沒有實現。
事務
事務就是一組原子性的sql查詢,事務內的語句,要麼全部執行成功,要麼全部執行失敗