MySQL運行原理與基礎架構

1.MySQL基礎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。linux

和其它數據庫相比,MySQL有點不同凡響,它的架構能夠在多種不一樣場景中應用併發揮良好做用。主要體如今存儲引擎的架構上,插件式的存儲引擎架構將查詢處理和其它的系統任務以及數據的存儲提取相分離。這種架構能夠根據業務的需求和實際須要選擇合適的存儲引擎。sql

2.MySQL邏輯架構數據庫

 

1.最上層是一些客戶端和鏈接服務,包含本地sock通訊和大多數基於客戶端/服務端工具實現的相似於tcp/ip的通訊。主要完成一些相似於鏈接處理、受權認證、及相關的安全方案。在該層上引入了線程池的概念,爲經過認證安全接入的客戶端提供線程。一樣在該層上能夠實現基於SSL的安全連接。服務器也會爲安全接入的每一個客戶端驗證它所具備的操做權限。windows

2.第二層架構主要完成大多少的核心服務功能,如SQL接口,並完成緩存的查詢,SQL的分析和優化及部份內置函數的執行。全部跨存儲引擎的功能也在這一層實現,如過程、函數等。在該層,服務器會解析查詢並建立相應的內部解析樹,並對其完成相應的優化如肯定查詢表的順序,是否利用索引等,最後生成相應的執行操做。若是是select語句,服務器還會查詢內部的緩存。若是緩存空間足夠大,這樣在解決大量讀操做的環境中可以很好的提高系統的性能。緩存

3.存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器經過API與存儲引擎進行通訊。不一樣的存儲引擎具備的功能不一樣,這樣咱們能夠根據本身的實際須要進行選取。安全

4.數據存儲層,主要是將數據存儲在運行於裸設備的文件系統之上,並完成與存儲引擎的交互。服務器

鏈接管理與安全性(第一層 服務層)
 
 > 鏈接流程

 Δ 每一個鏈接的查詢都在一個進程中的線程完成。數據結構

 Δ 服務器負責緩存線程,因此服務層不須要爲每一個新建的鏈接建立或者銷燬線程(可使用線程池)。

> 認證流程架構

一、當客戶端(應用)鏈接到MySQL服務器時,服務器須要對其進行認證。認證基於用戶名、原始主機信息和密碼。若是使用了安全套接字的方式鏈接,還可使用X.509證書認證。

二、一旦客戶端鏈接成功,服務器會繼續驗證該客戶是否具備執行某個查詢的權限(例如對某個庫某張表執行查詢語句)

 

 優化與執行

一、MySQL會解釋查詢,並建立內部數據結構(解析樹),而後對其進行各類優化,包括重寫查詢、決定表的讀取順序,以及選擇合適的索引等。

二、 對於SELECT語句,在解析查詢以前,服務器會先檢查查詢緩存,若是能命中,服務器就沒必要再執行查詢解析、優化和執行的整個過程,直接返回查詢緩存中的結果集。

3.併發控制和鎖的概念

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

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

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

4.事務

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

start transaction;
select ... update ... insert ... commit;

注意:默認MySQL中自動提交是開啓的:

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

2.事務具備ACID的特性:

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

一致性(consistency):數據庫老是從一個一致性狀態轉換到另外一個一致性狀態。

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

持久性(durability):一旦事務提交,其所作的修改便會永久保存在數據庫中。

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

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

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

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

SERIALIZABLE(串行化):只有一個事務提交以後纔會執行另外一個事務。

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

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

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

1.MySQL採用插件式的存儲引擎架構,能夠根據不一樣的需求爲不一樣的表設置不一樣的存儲引擎。能夠經過以下命令顯示數據庫中表的狀態信息,以vtu_info表爲例,顯示以下:

mysql> show table status like 'vtu_info'\G
*************************** 1. row ***************************
           Name: vtu_info
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 32
 Avg_row_length: 512
    Data_length: 16384
Max_data_length: 0
   Index_length: 16384
      Data_free: 0
 Auto_increment: 13843
    Create_time: 2015-09-16 18:34:23
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

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

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專用。

相關文章
相關標籤/搜索