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