1. 程式人生 > >MySQL執行原理與基礎架構細說

MySQL執行原理與基礎架構細說

1.MySQL基礎

     

       MySQL是一個開放原始碼的關係資料庫管理系統。原開發者為瑞典的MySQL AB公司,最早是在2001年MySQL3.23進入到管理員的視野並在之後獲得廣泛的應用。 2008年MySQL公司被Sun公司收購併釋出了首個收購之後的版本MySQL5.1,該版本引入分割槽、基於行復制以及plugin API。移除了原有的BerkeyDB引擎,同時,Oracle收購InnoDB Oy釋出了InnoDB plugin,這後來發展成為著名的InnoDB引擎。2010年Oracle收購Sun公司,這也使得MySQL歸入Oracle門下,之後Oracle釋出了收購以後的首個版本5.5,該版本主要改善集中在效能、擴充套件性、複製、分割槽以及對windows的支援。目前版本已發展到5.7。

   和其它資料庫相比,MySQL有點與眾不同,它的架構可以在多種不同場景中應用併發揮良好作用。主要體現在儲存引擎的架構上,外掛式的儲存引擎架構將查詢處理和其它的系統任務以及資料的儲存提取相分離。這種架構可以根據業務的需求和實際需要選擇合適的儲存引擎。

 

2.MySQL邏輯架構倫理片 http://www.dotdy.com/  

wKiom1LUF8DS1inQAAE8bwOlNTY150.jpg

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.事務

   

1.簡單的說事務就是一組原子性的SQL語句。可以將這組語句理解成一個工作單元,要麼全部執行要麼都不執行。在MySQL中可以使用如下命令操作事務:

 

1

2

3

4

5

start transaction;

select ...

update ...

insert ...

commit;

 

注意:預設MySQL中自動提交是開啟的:

wKioL1LUGiOAT6qwAABbXd_fBHM890.jpg2.事務具有ACID的特性:

 原子性(atomicity):事務中的所有操作要麼全部提交成功,要麼全部失敗回滾。

 一致性(consistency):資料庫總是從一個一致性狀態轉換到另一個一致性狀態。

 隔離性(isolation):一個事務所做的修改在提交之前對其它事務是不可見的。

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

3.事務的隔離級別:在SQL標準中定義了四種隔離級別:

   READ UNCOMMITTED(讀未提交):事務中的修改即使未提交也是對其它事務可見

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

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

   SERIALIZABLE(序列化):只有一個事務提交之後才會執行另一個事務。

4.MySQL中可以利用如下語句查詢並臨時修改隔離級別:

wKiom1LUGsWyoJ8aAADVyWnn5YE501.jpg

5.死鎖:兩個或多個事務在同一資源上相互佔用並請求鎖定對方佔用的資源,從而導致惡性迴圈的現象。MySQL的部分儲存引擎能夠檢測到死鎖的迴圈依賴併產生相應的錯誤。InnoDB引擎解決死鎖的方案是將持有最少排它鎖的事務進行回滾。

 

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

 

1.MySQL採用外掛式的儲存引擎架構,可以根據不同的需求為不同的表設定不同的儲存引擎。可以通過如下命令顯示資料庫中表的狀態資訊,以user表為例,顯示如下:

wKioL1LUG0XBZhyYAAEHkyTCZ4Y876.jpg

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:額外的一些註釋資訊,根據儲存引擎的不同表示的內容也不脛相同。

 

2.儲存引擎介紹:

InnoDB引擎:

   1.將資料儲存在表空間中,表空間由一系列的資料檔案組成,由InnoDB管理;

   2.支援每個表的資料和索引存放在單獨檔案中(innodb_file_per_table);

   3.支援事務,採用MVCC來控制併發,並實現標準的4個事務隔離級別,支援外來鍵;

   4.索引基於聚簇索引建立,對於主鍵查詢有較高效能;

   5.資料檔案的平臺無關性,支援資料在不同的架構平臺移植;

   6.能夠通過一些工具支援真正的熱備。如XtraBackup等;

   7.內部進行自身優化如採取可預測性預讀,能夠自動在記憶體中建立hash索引等。

MyISAM引擎:

   1.MySQL5.1中預設,不支援事務和行級鎖;

   2.提供大量特性如全文索引、空間函式、壓縮、延遲更新等;

   3.資料庫故障後,安全恢復性差;

   4.對於只讀資料可以忍受故障恢復,MyISAM依然非常適用;

   5.日誌伺服器的場景也比較適用,只需插入和資料讀取操作;

   6.不支援單表一個檔案,會將所有的資料和索引內容分別存在兩個檔案中;

   7.MyISAM對整張表加鎖而不是對行,所以不適用寫操作比較多的場景;

   8.支援索引快取不支援資料快取。

Archive引擎:

   1.只支援insert和select操作;

   2.快取所有的寫資料並進行壓縮儲存,支援行級鎖但不支援事務;

   3.適合高速插入和資料壓縮,減少IO操作,適用於日誌記錄和歸檔伺服器。

Blackhole引擎:

   1.沒有實現任何儲存機制,會將插入的資料進行丟棄,但會儲存二進位制日誌;

   2.會在一些特殊需要的複製架構的環境中使用。

CSV引擎:

   1.可以開啟CSV檔案儲存的資料,可以將儲存的資料匯出,並利用excel開啟;

   2.可以作為一種資料交換的機制,同樣經常使用。

Memory引擎:

   1.將資料在記憶體中快取,不消耗IO;

   2.儲存資料速度較快但不會被保留,一般作為臨時表的儲存被使用。

Federated引擎:

 能夠訪問遠端伺服器上的資料的儲存引擎。能夠建立一個連線連到遠端伺服器。

Mrg_MyISAM引擎:

 將多個MYISAM表合併為一個。本身並不儲存資料,資料存在MyISAM表中間。

NDB叢集引擎:

   MySQL Cluster專用。

 

3.第三方儲存引擎:

1.OLTP類:

   XtraDB:InnoDB的改進版本。

   PBXT:類似InnoDB,但提供引擎級別的複製和外來鍵約束,適當支援SSD儲存。

   TokuDB(開源):支援分形樹索引結構,支援海量資料的分析。

2.列式儲存引擎:MySQL預設是面向行的儲存

   Infobright:  支援數十TB的資料量,為資料分析和資料倉庫設計的。資料高度壓縮。

   InfiniDB:可以在一組叢集間做分散式查詢,有商業版但沒有典型應用案例。

3.社群儲存引擎:

   Aria:解決MyISAM崩潰安全恢復問題,並能夠進行資料快取。

   Groona: 全文索引引擎。

   QQGraph: 由Open query研發支援圖操作,比如查詢兩點間最短距離。

   SphinxSE: 該引擎為Sphinx全文索引搜尋伺服器提供SQL介面。

   Spider: 支援sharding並能夠基於分片實現並列查詢。

   VPForMySQL: 支援垂直分割槽。

 

4.儲存引擎選取參考因素

1.是否有事務需求

 如果需要事務支援最好選擇InnoDB或者XtraDB,如果主要是select和insert操作MyISAM比較合適,一般使用日誌型的應用。

2.備份操作需求

 如果能夠關閉伺服器進行備份,那麼該因素可以忽略,如果需要線上進行熱備份,則InnoDB引擎是一個不錯的選擇。

3.故障恢復需求

 在對恢復要求比較好的場景中推薦使用InnoDB,因為MyISAM資料損壞概率比較大而且恢復速度比較慢。

4.效能上的需求

 有些業務需求只有某些特定的儲存引擎才能夠滿足,如地理空間索引也只有MyISAM引擎支援。所以在應用架構需求環境中也需要管理員折衷考慮,當然從各方面比較而言,InnoDB引擎還是預設應該被推薦使用的。

 

5.表引擎轉換方法

1.直接修改

wKiom1LUHXXRY51IAABQ4S3D5Ms578.jpg

2.備份修改

 利用mysqldump備份工具將資料匯出,修改create table語句中的儲存引擎選項。注意修改的同時修改表名。

3.建立插入

wKioL1LUHZCzQUQRAADUyTtVq2M760.jpg