第1章 MySQL體系結(jié)構(gòu)和存儲引擎 閱讀總結(jié)

????????MySQL被設計為一個可移植的數(shù)據(jù)庫, 幾乎在當前所有系統(tǒng)上都能運行, 如 Linux, Solaris、FreeBSD、Mac和Windows。 盡管各平臺在底層(如線程) 實現(xiàn)方面都各有不同, 但是MySQL基本上能保證在各平臺上的物理體系結(jié)構(gòu)的一致性。 因此, 用戶應該能很好地理解MySQL數(shù)據(jù)庫在所有這些平臺上是如何運作的。

1.1 定義數(shù)據(jù)庫和實例

????????在數(shù)據(jù)庫領域中有兩個詞很容易混淆, 這就是 “數(shù)據(jù)庫"(database) 和 “ 實例 ” (instance)。 作為常見的數(shù)據(jù)庫術語, 這兩個詞的定義如下。

? ??????數(shù)據(jù)庫:物理操作系統(tǒng)文件或其他形式文件類型的集合。 在MySQL數(shù)據(jù)庫中, 數(shù)據(jù)庫文件可以是frm、MYD、MYI、ibd結(jié)尾的文件。 當使用NDB引擎時, 數(shù)據(jù)庫的文件可能不是操作系統(tǒng)上的文件, 而是存放于內(nèi)存之中的文件, 但是定義仍然不變。

? ??????實例: MySQL數(shù)據(jù)庫由后臺線程以及一個共享內(nèi)存區(qū)組成。 共享內(nèi)存可以被運行的后臺線程所共享。 需要牢記的是, 數(shù)據(jù)庫實例才是真正用于操作數(shù)據(jù)庫文件的。

? ??????在MySQL數(shù)據(jù)庫中, 實例與數(shù)據(jù)庫的關通常系是一一對應的, 即一個實例對應一個數(shù)據(jù)庫, 一個數(shù)據(jù)庫對應一 個實例。 但是, 在集群情況下可能存在一個數(shù)據(jù)庫被多個數(shù)據(jù)實例使用的情況。

? ??????MySQL被設計為一個單進程多線程架構(gòu)的數(shù)據(jù)庫, 這點與SQLServer比較類似,但與Oracle多進程的架構(gòu)有所不同(Oracle的Windows版本也是單進程多線程架構(gòu)的)。 這也就是說, MySQL數(shù)據(jù)庫實例在系統(tǒng)上的表現(xiàn)就是一個進程。

1.2 MySQL 體系結(jié)構(gòu)

????????從概念上來說,數(shù)據(jù)庫是文件的集合,是依照某種數(shù)據(jù)模型組織起來并存放于二級存儲器中的數(shù)據(jù)集合;數(shù)據(jù)庫實例是程序,是位于用戶與操作系統(tǒng)之間的一層數(shù)據(jù)管理軟件,用戶對數(shù)據(jù)庫數(shù)據(jù)的任何操作,包括數(shù)據(jù)庫定義、數(shù)據(jù)查詢、數(shù)據(jù)維護、數(shù)據(jù)庫運行控制等都是在數(shù)據(jù)庫實例下進行的,應用程 序只有通過數(shù)據(jù)庫實例才能和數(shù)據(jù)庫打交道。



????????從圖 1-1 還可以發(fā)現(xiàn),MySQL數(shù)據(jù)庫區(qū)別于其他數(shù)據(jù)庫的最重要的一個特點就是其插件式的表存儲引擎。MySQL插件式的存儲引擎架構(gòu)提供了一系列標準的管理和服務支持,這些標準與存儲引擎本身無關,可能是每個數(shù)據(jù)庫系統(tǒng)本身都必需的,如 SQL分析器和優(yōu)化器等,而存儲引擎是底層物理結(jié)構(gòu)的實現(xiàn), 每個存儲引擎開發(fā)者可以按照自己的意愿來進行開發(fā)。

????????需要特別注意的是,存儲引擎是基于表的,而不是數(shù)據(jù)庫。此外,要牢記圖 1-1 的 MySQL體系結(jié)構(gòu),它對于以后深入理解MySQL數(shù)據(jù)庫會有極大的幫助。

1.3 MySQL存儲引擎

? ??????通過1.2節(jié)大致了解了MySQL數(shù)據(jù)庫獨有的插件式體系結(jié)構(gòu),并了解到存儲引擎是MySQL區(qū)別于其他數(shù)據(jù)庫的一個最重要特性。存儲引擎的好處是,每個存儲引擎都有各自的特點, 能夠根據(jù)具體的應用建立不同存儲引擎表

1.3.1 lnnoDB 存儲引擎

? ??????InnoDB存儲引擎支持事務,其設計目標主要面向在線事務處理 (OLTP) 的應用。其特點是行鎖設計、支持外鍵,并支持類似于 Oracle 的非鎖定讀,即默認讀取操作不會產(chǎn)生鎖。從 MySQL 數(shù)據(jù)庫 5.5.8 版本開始,InnoDB 存儲引擎是默認的存儲引擎。

? ??????InnoDB存儲引擎將數(shù)據(jù)放在一個邏輯的表空間中,這個表空間就像黑盒一樣由 InnoDB 存儲引擎自身進行管理。從 MySQL 4.1 (包括 4.1) 版本開始,它可以將每個InnoDB存儲引擎的表單獨存放到一個獨立的 ibd 文件中。此外,InnoDB 存儲引擎支持用裸設備 (row disk) 用來建立其表空間。

????????InnoDB 通過使用多版本并發(fā)控制 (MVCC) 來獲得高并發(fā) 性,并且實現(xiàn)了 SQL標準的 4 種隔離級別,默認為 REPEATABLE 級別。同時,使用一種被稱為 next-key locking 的策略來避免幻讀 (phantom) 現(xiàn)象的產(chǎn)生。除此之外,InnoDB 儲存引擎還提供了插人緩沖 (insert buff er)、二次寫 (double write)、自適應哈希索引 (adaptive hash index)、預讀 (read ahead) 等高性能和高可用的功能。

????????對于表中數(shù)據(jù)的存儲,InnoDB 存儲引擎采用了聚集 (clustered) 的方式,因此每張表的存儲都是按主鍵的順序進行存放。如果沒有顯式地在表定義時指定主鍵,InnoDB 存 儲引擎會為每一行生成一個 6 字節(jié)的 ROWID, 并以此作為主鍵。

1.3.2 MylSAM存儲引擎

? ??????MyISAM存儲引擎 不支持事務、表鎖設計, 支持全文索引,主要面向一些OLAP數(shù)據(jù)庫應用。在MySQL 5.5.8版本之前MylSAM存儲引擎是默認的存儲引擎(除Windows版本外)。數(shù)據(jù)庫系統(tǒng)與文件系統(tǒng)很大的 個不同之處在于對事務的支持,然而MyISAM存儲引擎是不支持事務的。究其根本,這也不是很難理解。試想用戶是否在所有的應用中都需要事務呢?在數(shù)據(jù)倉庫中,如果沒有 ETL這些操作, 只是簡單的報表查詢是否還需要事務的支持呢?此外,MylSAM存儲引擎的另一個與眾不同的地方是它 的緩沖池只 緩存(cache)索引文件,而不緩沖數(shù)據(jù)文件,這點和大多數(shù)的數(shù)據(jù)庫都非常不同 。

????????MyISAM存儲引擎表由MYD和MYI組成,MYD用來存放數(shù)據(jù)文件,MYI用來存放索引文件。可以通過使用myisampack工具來進一步壓縮數(shù)據(jù)文件,因為myisampack 工具使用赫夫曼(Huffma n)編碼靜態(tài)算法來壓縮數(shù)據(jù),因此使用myisampack工具壓縮后的表是只讀的,當然用戶也可以通過myisampack來解壓數(shù)據(jù)文件。

1.3.3 NOB存儲引擎

????????NOB存儲引擎是一個集群存儲引擎,類似于Oracle的RAC集群,不過與Oracle RACshare everything架構(gòu)不同的是,其結(jié)構(gòu)是 share nothing的集群架構(gòu),因此能提供更高的可用性。NOB的特點是數(shù)據(jù)全部放在內(nèi)存中(從MySQL 5.1版本開始,可以將非索引數(shù)據(jù)放在 磁盤上),因此主鍵查找(primary key lookups)的速度極快,并且通過添加NOB數(shù)據(jù)存儲節(jié)點(Data Node)可以線性地提高數(shù)據(jù)庫性能,是高可用、高性能的集群系統(tǒng)。

? ??????關于 NDB存儲引擎,有一個問題值得注意,那就是 NDB存儲引擎的連接操作(JOIN)是在 MySQL數(shù)據(jù)庫層完成的,而不是在存儲引擎層完成的。這意味著,復雜的連接操作需要巨大的網(wǎng)絡開銷,因此查詢速度很慢。如果解決了這個問題,NDB存儲引 擎的市場應該是非常巨大的。

1.3.4 Memory存儲引擎

? ??????Memory存儲引擎( 之前稱HEAP存儲引擎)將表中的數(shù)據(jù)存放在內(nèi)存中,如果數(shù)據(jù)庫重啟或發(fā)生崩潰,表中的數(shù)據(jù)都將消失。它非常適合用于存儲臨時數(shù)據(jù)的臨時表, 以及數(shù)據(jù)倉庫中的緯度表。Memory存儲引擎默認使用哈希索引,而不是我們熟悉的 B+ 樹索引。

? ??????雖然Memory存儲引擎速度非???,但在使用上還是有一定的限制。比如,只支持表鎖,并發(fā)性能較差,并且不支持TEXT和BLOB列類型。最重要的是,存儲變長字段(varchar)時是按照定常字段(char)的方式進行的,因此會浪費內(nèi)存。

? ??????此外有一點容易被忽視,MySQL數(shù)據(jù)庫使用Memory存儲引擎作為臨時表來存放查詢的中間結(jié)果集(intermediate result)。如果中間結(jié)果集大于 Memory存儲引擎表的容量設置,又或者中間結(jié)果含有TEXT或BLOB列類型字段,則MySQL數(shù)據(jù)庫會把其轉(zhuǎn)換到MylSAM存儲引擎表而存放到磁盤中。之前提到MyISAM不緩存數(shù)據(jù)文件,因此這時產(chǎn)生的臨時表的性能對于查詢會有損失。

1.3.5 Archive存儲引擎

? ??????Archive存 儲引擎只支持 INSERT和SELECT操作,從MySQL 5.1開始支持 索 引。Archive存儲引擎使用zlib算法將數(shù)據(jù)行(row)進行壓縮后存儲, 壓縮比一般可達1 : 10。正如其名字所示,Archive存儲引擎非常適合存儲歸檔數(shù)據(jù),如日志信息。 Archive存儲引擎使用行鎖來實現(xiàn)高并發(fā)的插入操作,但是其本身并不是事務安全的存 儲引擎,其設計目標主要是提供高速的插入和壓縮功能。

1.3.6 Federated存儲引擎

????????Federated存儲引擎表并不存放數(shù)據(jù),它只是指向一臺遠程MySQL數(shù)據(jù)庫服務器上的表。這非常類似于SQL Server的鏈接服務器和Oracle的透明網(wǎng)關,不同的是,當前 Federated存儲引擎只支持 MySQL數(shù)據(jù)庫表,不支持異構(gòu)數(shù)據(jù)庫表。

1.3.7 Maria存儲引擎

????????Maria存儲引擎 是新開發(fā)的引擎,設計目標主要是用來取代原有的 MyISAM存儲引擎,從而成為MySQL的默認存儲引擎。Maria存儲引擎的開發(fā)者是MySQL的創(chuàng)始人之 一的 Michael Widenius。 因此,它可以看做是MyISAM的后續(xù)版本。Maria存儲引擎的特點是:支持緩存數(shù)據(jù)和索引文件,應用了行鎖 設計, 提供了MVCC功能,支持事務和非事務安全的選項,以及更好的BLOB字符類型的處理性能。

1.5 連接MySQL

????????本節(jié)將介紹連接MySQL數(shù)據(jù)庫的常用方式。需要理解的是,連接MySQL操作是一個連接進程和MySQL數(shù)據(jù)庫實例進行通信。從程序設計的角度來說,本質(zhì)上是進程通信。 如果對進程通信比較了解,可以知道常用的進程通信方式有管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。MySQL數(shù)據(jù)庫提供的連接方式從本質(zhì)上看都是上述提及的進程通信方式。

1.5.1 TCP/IP

????????TCP/IP套接字方式是MySQL數(shù)據(jù)庫在任何平臺下都提供的連接方式,也是網(wǎng)絡中使用得最多的一種方式。這種方式在TCP/IP連接上建立一個基于網(wǎng)絡的連接請求,,一般情況下客戶端(client)在一臺服務器上,而MySQL 實例(server)在另一臺服務器上,這兩臺機器通過一個TCP/IP網(wǎng)絡連接。

1.5.2 命名管道和共享內(nèi)存

????????在 Windows2000、 WindowsXP、 Windows 2003 和 Windows Vista 以及在此之上的平臺上, 如果兩個需要進程通信的進程在同一臺服務器上, 那么可以使用命名管道, Microsoft SQL Server 數(shù)據(jù)庫默認安裝后的本地連接也是使用命名管道。在 MySQL 數(shù)據(jù)庫中須在配置文件中啟用 --enable-named-pipe 選項。 在 MySQL 4.1 之后的版本中, MySQL 還提供了 共享內(nèi)存的連接方式, 這是通過在配置文件中添加 --shared-memory 實現(xiàn)的。 如果想使用 共享內(nèi)存的方式, 在連接時, MySQL 客戶端還必須使用 --protocol=memory 選項。

1.5.3 UNIX 域套接字

? ??????在Linux和UNIX環(huán)境下, 還可以使用UNIX域套接字。UNIX域套接字其實不是一個網(wǎng)絡協(xié)議, 所以只能在 MySQL 客戶端和數(shù)據(jù)庫實例在一臺服務器上的情況下使用。 用戶可以在配置文件中指定套接字文件的路徑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容