一、MySQL體系結(jié)構(gòu)和存儲引擎盡管各個平臺在底層(如線程)實現(xiàn)方面都各不相同,但MySQL基本上能保證在各個平臺上的物理結(jié)構(gòu)的一致性。因此,用戶應(yīng)該能很好的理解MySQL數(shù)據(jù)庫在所有這些平臺是如何運(yùn)作的。 1.1 定義數(shù)據(jù)庫和實例數(shù)據(jù)庫:物理操作系統(tǒng)文件或其他形式文件類型的集合。在MySQL數(shù)據(jù)庫中,數(shù)據(jù)庫文件可以是frm、myd、myi、ibd文件。NDB引擎,是存放于內(nèi)存之中的文件,但定義不變。 實例:MySQL數(shù)據(jù)庫由后臺線程以及一個共享內(nèi)存區(qū)組成。共享內(nèi)存可以被運(yùn)行的后臺線程所共享。在集群情況下,可能存在一個數(shù)據(jù)庫被多個數(shù)據(jù)實例使用的情況。 從概念上來講,數(shù)據(jù)庫是文件的集合,是按照某種數(shù)據(jù)模型組織起來并存放于二級存儲器中的數(shù)據(jù)集合。 數(shù)據(jù)庫實例是程序,是位于用戶與操作系統(tǒng)之間的一層數(shù)據(jù)管理軟件,用戶對數(shù)據(jù)庫數(shù)據(jù)的任何操作,包括數(shù)據(jù)庫定義、數(shù)據(jù)查詢、數(shù)據(jù)維護(hù)、數(shù)據(jù)庫運(yùn)行控制等都是在數(shù)據(jù)庫實例下進(jìn)行的,應(yīng)用程序只有通過數(shù)據(jù)庫實例才能和數(shù)據(jù)庫打交道。
MySQL 是一個單進(jìn)程多線程架構(gòu)的數(shù)據(jù)庫。 MySQL 數(shù)據(jù)庫是按照 /etc/my.cnf -> /etc/myssql/my.cnf -> /usr/local/mysql/etc/my.cnf -> ~/.my.cnf 的順序讀取配置文件的。 如果幾個配置文件中有相同的參數(shù),MySQL數(shù)據(jù)庫以最后讀取到的一個配置文件中的參數(shù)為準(zhǔn)。 1.2 MySQL 體系結(jié)構(gòu)
由圖可知,MySQL由以下幾部分組成:
MySQL區(qū)別于其他數(shù)據(jù)庫的最重要的一個特點就是插件式的表存儲引擎,注意,存儲引擎是基于表的。 1.3 MySQL存儲引擎1.3.1 InnoDB 存儲引擎其設(shè)計目標(biāo)主要是面向在線事務(wù)處理(OLTP)的應(yīng)用。其特點是支持事務(wù)、行鎖設(shè)計、支持外鍵、非鎖定讀(MVCC,即默認(rèn)讀取操作不會產(chǎn)生鎖)。在MySQL5.5.8以后,InnoDB是默認(rèn)的存儲引擎。 InnoDB通過使用多版本并發(fā)控制(MVCC)來獲得高并發(fā),并實現(xiàn)了四種隔離級別,默認(rèn)是 REPEATABLE級別 使用next-key locking 的策略來避免幻讀現(xiàn)象 提供了插入緩沖(insert buffer)、二次寫(double write)、自適應(yīng)哈希索引(adaptive hash index)、預(yù)讀(read ahead)等高性能和高可用的功能 對表中的數(shù)據(jù)采用聚集(clustered)方式,因此每張表都是按照主鍵的順序進(jìn)行存放,如果沒有在表定義中指定主鍵,InnoDB存儲引擎將會為每一行生成一個6字節(jié)的ROWID,并以此作為主鍵。 1.3.2 MyISAM存儲引擎不支持事務(wù)、表鎖設(shè)計、支持全文索引,主要面向OLAP應(yīng)用 MySQL 5.5.8 之前的默認(rèn)存儲引擎 緩沖池只緩存索引文件,不緩存數(shù)據(jù)文件。數(shù)據(jù)文件由操作系統(tǒng)本身來完成 1.3.3 NDB 存儲引擎數(shù)據(jù)省略
1.5 鏈接 MySQL連接 MySQL操作是一個連接進(jìn)程和MySQL數(shù)據(jù)庫實例進(jìn)行通信。從程序設(shè)計的角度的來看,本質(zhì)是進(jìn)程通信。常見的進(jìn)程通信方式有 管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。 1.5.1 TCP/IP 通信這種方式在 TCP/IP 連接上建立一個基于網(wǎng)絡(luò)的連接請求,一般情況下,客戶端在一臺服務(wù)器,而MySQL實例(服務(wù)端)在另一臺服務(wù)器,機(jī)器之間通過 TCP/IP 進(jìn)行網(wǎng)絡(luò)連接。 在通過TCP/IP 連接到MySQL 實例時,MySQL 數(shù)據(jù)庫會先檢查一張權(quán)限視圖,用來判斷發(fā)起請求的客戶端是否允許連接到MySQL實例。 1.5.2 命名管道和共享內(nèi)存如果兩個需要進(jìn)程通信的進(jìn)程在同一個服務(wù)器上,那么可以使用命名管道。MySQL 4.1 之后,還提供了共享內(nèi)存的連接方式。 1.5.3 UNIX 域套接字在Linux 和 UNIX環(huán)境下,還可以使用UNIX 域套接字。UNIX 套接在不是一個協(xié)議,所以只能在 MySQL 客戶端和數(shù)據(jù)庫實例在同一臺服務(wù)器上的情況下使用。
|
|