1. 程式人生 > >MySQL執行機制原理&架構

MySQL執行機制原理&架構

1.MySQL知識普及:

MySQL是一個開放原始碼的關係資料庫管理系統。

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

2.MySQL邏輯架構:

jiagou_png

1).最上層:

最上層是一些客戶端和連線服務,包含本地的sock通訊和大多數基於客戶端/服務端工具實現的類似於tcp/ip的通訊,主要完成一些類似於連線處理、授權認證及相關的安全方案,在該層上引用了執行緒池的概念,為通過認證安全接入的客戶端提供執行緒。同樣在該層上可以實現基於ssl的安全連結。伺服器也會為安全接入的每個客戶端驗證它所具有的操作許可權。

2).第二層:

第二層架構主要完成大多數的核心服務功能。如sql介面,並完成快取的查詢。sql的分析和優化 以及部分內建函式的執行。所有跨儲存引擎的功能也在這一層實現,如過程,函式等。在該層,伺服器會解析查詢並建立相應的內部解析樹,並對其完成相應的優化如確定查詢表的順序,是否利用索引等。最後生成相應的執行操作。如select語句,伺服器還會查詢內部的快取。如果快取空間足夠大,這樣就解決大量讀操作的環境中能夠很好的提升系統的效能。

3).儲存引擎層:

儲存引擎真正的負責MySQL中資料的儲存和提取,伺服器通過API與儲存引擎進行通訊,不同的儲存引擎具有的功能不同,這樣我們可以根據自己的實際需進行選取。

4).資料儲存層:

主要是將資料儲存在運行於裸裝置的檔案系統之上,並完成於儲存引擎的互動。

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

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

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

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

4.事務:

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

操作事務:

shiwu

事務具有ACID的特性:

原子性:

事務中的所有操作要麼全部提交成功,要麼全部失敗回滾

比如你從取款機取錢,這個事務可以分成兩個步驟:1劃卡,2出錢.不可能劃了卡,而錢卻沒出來.這兩步必須同時完成.要麼就不完成. 

一致性:

資料庫總是從給一個一致性的狀態轉換到另一個一致性的狀態

例如,完整性約束了a+b=10,一個事務改變了a,那麼b也應該隨之改變.不管資料怎麼改變。一定是符合約束

隔離性:

一個事務所做的修改在提交之前對其它事務是不可見的

兩個以上的事務不會出現交錯執行的狀態.因為這樣可能會導致資料不一致.

永續性:

一旦事務提交,其所做的修改便會永久儲存在資料庫中。

事務的隔離級別:

READ UNCOMMITTED(讀未提交):

事務中的修改即使未提交也是對其它事務可見

READ COMMITTED(讀提交):

事務提交後所做的修改才會被另一個事務看見,可能產生一個事務中兩次查詢的結果不同。

REPEATABLE READ(可重讀):

只有當前事務提交才能看見另一個事務的修改結果。解決了一個事務中兩次查詢的結果不同的問題。

SERIALIZABLE(序列化):

只有一個事務提交之後才會執行另一個事務。

查詢並修改隔離級別:

geli

死鎖:

兩個或多個事務在同一資源上相互佔用並請求鎖定對方佔用的資源,從而導致惡性迴圈的現象。

對於死鎖的處理:MySQL的部分儲存引擎能夠檢測到死鎖的迴圈依賴併產生相應的錯誤。InnoDB引擎解決的死鎖的方案是將持有最少寫鎖的事務進行回滾。

為了提供回滾或者撤銷未提交的變化的能力,許多資料來源採用日誌機制。例如:sql server使用一個預寫事務日誌,在將資料應用於(或提交到)實際資料頁面前,先寫在事務日誌上。但是,其他一些資料來源不是關係型資料庫管理系統,他們管理未提交事務的方式完全不同。只要事務回滾時,資料來源可以撤銷所有未提交的改變,那麼這種技術可用於事務管理。

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

MySQL採用外掛式的儲存引擎的架構,可以根據不同的需求為不同的表設定不同的儲存引擎。

如:

usem

相關欄位介紹:

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://www.linuxidc.com/Linux/2014-04/99721.htm