MySQL運行機制原理&架構


1.MySQL知識普及:

MySQL是一個開放源代碼的關系數據庫管理系統。

MySQL架構可以在多種不同場景中應用並發揮良好作用。主要體現在存儲引擎的架構上,插件式的存儲引擎架構將查詢處理和其它的系統任務以及數據的存儲提取相分離。

 2.MySQL邏輯架構:

1).Connectors
MySQL首先是一個網絡程序,其在TCP之上定義了自己的應用層協議。所以要使用MySQL,我們可以編寫代碼,跟MySQL Server建立TCP連接,之后按照其定義好的協議進行交互。當然這樣比較麻煩,比較方便的辦法是調用SDK,比如Native C API、JDBC、PHP等各語言MySQL Connector,或者通過ODBC。但通過SDK來訪問MySQL,本質上還是在TCP連接上通過MySQL協議跟MySQL進行交互。

2).Connection Management

每一個基於TCP的網絡服務都需要管理客戶端鏈接,MySQL也不例外。MySQL會為每一個連接綁定一個線程,之后這個連接上的所有查詢都在這個線程中執行。為了避免頻繁創建和銷毀線程帶來開銷,MySQL通常會緩存線程或者使用線程池,從而避免頻繁的創建和銷毀線程。

客戶端連接到MySQL后,在使用MySQL的功能之前,需要進行認證,認證基於用戶名、主機名、密碼。如果用了SSL或者TLS的方式進行連接,還會進行證書認證。

 3).SQL Interface

MySQL支持DML(數據操作語言)、DDL(數據定義語言)、存儲過程、視圖、觸發器、自定義函數等多種SQL語言接口。

4).Parser

MySQL會解析SQL查詢,並為其創建語法樹,並根據數據字典豐富查詢語法樹,會驗證該客戶端是否具有執行該查詢的權限。創建好語法樹后,MySQL還會對SQl查詢進行語法上的優化,進行查詢重寫。

5).Optimizer

語法解析和查詢重寫之后,MySQL會根據語法樹和數據的統計信息對SQL進行優化,包括決定表的讀取順序、選擇合適的索引等,最終生成SQL的具體執行步驟。這些具體的執行步驟里真正的數據操作都是通過預先定義好的存儲引擎API來進行的,與具體的存儲引擎實現無關。

6).Caches & Buffers

MySQL內部維持着一些Cache和Buffer,比如Query Cache用來緩存一條Select語句的執行結果,如果能夠在其中找到對應的查詢結果,那么就不必再進行查詢解析、優化和執行的整個過程了。

7).Pluggable Storage Engine

存儲引擎的具體實現,這些存儲引擎都實現了MySQl定義好的存儲引擎API的部分或者全部。MySQL可以動態安裝或移除存儲引擎,可以有多種存儲引擎同時存在,可以為每個Table設置不同的存儲引擎。存儲引擎負責在文件系統之上,管理表的數據、索引的實際內容,同時也會管理運行時的Cache、Buffer、事務、Log等數據和功能。

3.並發控制和鎖的概念:

當數據庫中有多個操作需要修改同一數據時,不可避免的會產生數據的臟讀。這時就需要數據庫具有良好的並發控制能力,這一切在MySQL中都是由服務器和存儲引擎來實現的。

解決並發問題最有效的方案是引入了鎖的機制,鎖在功能上分為共享鎖(shared lock)和排它鎖(exclusive lock)即通常說的讀鎖和寫鎖。當一個select語句在執行時可以施加讀鎖,這樣就可以允許其它的select操作進行,因為在這個過程中數據信息是不會被改變的這樣就能夠提高數據庫的運行效率。當需要對數據更新時,就需要施加寫鎖了,不在允許其它的操作進行,以免產生數據的臟讀和幻讀。鎖同樣有粒度大小,有表級鎖(table lock)和行級鎖(row lock),分別在數據操作的過程中完成行的鎖定和表的鎖定。這些根據不同的存儲引擎所具有的特性也是不一樣的。

MySQL大多數事務型的存儲引擎都不只是簡單的行級鎖,基於性能的考慮,他們一般在行級鎖基礎上實現了多版本並發控制(MVCC)。這一方案也被Oracle等主流的關系數據庫采用。它是通過保存數據中某個時間點的快照來實現的,這樣就保證了每個事務看到的數據都是一致的。詳細的實現原理可以參考《高性能MySQL》第三版。

 4.事務:

簡單的說事務就是一組原子性的SQL語句。可以將這組語句理解成一個工作單元,要么全部執行要么都不執行。默認MySQL中自動提交時開啟的(start transaction)
操作事務:

事務具有ACID的特性:
原子性:
事務中的所有操作要么全部提交成功,要么全部失敗回滾
比如你從取款機取錢,這個事務可以分成兩個步驟:1划卡,2出錢.不可能划了卡,而錢卻沒出來.這兩步必須同時完成.要么就不完成. 
一致性:
數據庫總是從給一個一致性的狀態轉換到另一個一致性的狀態
例如,完整性約束了a+b=10,一個事務改變了a,那么b也應該隨之改變.不管數據怎么改變。一定是符合約束
隔離性:
一個事務所做的修改在提交之前對其它事務是不可見的
兩個以上的事務不會出現交錯執行的狀態.因為這樣可能會導致數據不一致.
持久性:
一旦事務提交,其所做的修改便會永久保存在數據庫中。

事務的隔離級別:
READ UNCOMMITTED(讀未提交):
事務中的修改即使未提交也是對其它事務可見
READ COMMITTED(讀提交):
事務提交后所做的修改才會被另一個事務看見,可能產生一個事務中兩次查詢的結果不同。
REPEATABLE READ(可重讀):
只有當前事務提交才能看見另一個事務的修改結果。解決了一個事務中兩次查詢的結果不同的問題。
SERIALIZABLE(串行化):
只有一個事務提交之后才會執行另一個事務。

查詢並修改隔離級別:

死鎖:
兩個或多個事務在同一資源上相互占用並請求鎖定對方占用的資源,從而導致惡性循環的現象。
對於死鎖的處理:MySQL的部分存儲引擎能夠檢測到死鎖的循環依賴並產生相應的錯誤。InnoDB引擎解決的死鎖的方案是將持有最少寫鎖的事務進行回滾。
為了提供回滾或者撤銷未提交的變化的能力,許多數據源采用日志機制。例如:sql server使用一個預寫事務日志,在將數據應用於(或提交到)實際數據頁面前,先寫在事務日志上。但是,其他一些數據源不是關系型數據庫管理系統,他們管理未提交事務的方式完全不同。只要事務回滾時,數據源可以撤銷所有未提交的改變,那么這種技術可用於事務管理。

 

5.MySQL存儲引擎及應用方案:

MySQL采用插件式的存儲引擎的架構,可以根據不同的需求為不同的表設置不同的存儲引擎。

如:

相關字段介紹:

Name:顯示的是表名
Engine:顯示存儲引擎,該表存儲引擎為MyISAM
Row_format:顯示行格式,對於MyISAM有Dynamic、Fixed和Compressed三種。非別表示表中有可變的數據類型,表中數據類型為固定的,以及表是壓縮表的環境。
Rows:顯示表中行數
Avg_row_length:平均行長度(字節)
Data_length:數據長度(字節)
Max_data_length:最大存儲數據長度(字節)
Data_free:已分配但未使用的空間,包括刪除數據空余出來的空間
Auto_increment:下一個插入行自動增長字段的值
Create_time:表的創建時間
Update_time:表數據的最后修改時間
Collation:表的默認字符集及排序規則
Checksum:如果啟用,表示整個表的實時校驗和
Create_options:創建表示的一些其它選項
Comment:額外的一些注釋信息,根據存儲引擎的不同表示的內容也不脛相同。


常用MySQL存儲引擎介紹:

InnoDB引擎:
將數據存儲在表空間中,表空間由一系列的數據文件組成,由InnoDb管理
支持每個表的數據和索引存放在單獨文件中(innodb_file_per_table);
支持事務,采用MVCC來控制並發,並實現標准的4個事務隔離級別,支持外鍵。
索引基於聚簇索引建立,對主鍵查詢有較高性能。
數據文件的平台無關性,支持數據在不同的架構平台移植
能夠通過一些工具支持真正的熱備,如XtraBackup等;
內部進行自身優化如采取可預測性預讀,能夠自動在內存中創建bash索引等
MyISAM引擎:
MySQL5.1默認,不支持事務和行級鎖
提供大量的特性如全文索引、空間函數、壓縮、延遲更新等
數據庫故障后,安全恢復性
對於只讀數據可以忍受故障恢復,MyISAM依然非常適用 
日志服務器的場景也比較適用,只需插入和數據讀取操作
不支持單表一個文件,會將所有的數據和索引內容分別存放在兩個文件中
MyISAM對整張表加鎖而不是對行,所以不適用寫操作比較多的場景
支持索引緩存不支持數據緩存

參考資料:

http://zhaox.github.io/2016/06/24/mysql-architecture

 http://blog.csdn.net/dream_188810/article/details/78870520

原文鏈接:

https://my.oschina.net/idea813/blog/1612284?utm_medium=referral


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM