第1章 MySQL體系結構和存儲引擎 閱讀總結

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

1.1 定義數據庫和實例

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

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

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

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

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

1.2 MySQL 體系結構

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



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

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

1.3 MySQL存儲引擎

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

1.3.1 lnnoDB 存儲引擎

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

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

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

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

1.3.2 MylSAM存儲引擎

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

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

1.3.3 NOB存儲引擎

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

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

1.3.4 Memory存儲引擎

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

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

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

1.3.5 Archive存儲引擎

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

1.3.6 Federated存儲引擎

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

1.3.7 Maria存儲引擎

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

1.5 連接MySQL

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

1.5.1 TCP/IP

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

1.5.2 命名管道和共享內存

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

1.5.3 UNIX 域套接字

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,791評論 6 545
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,795評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,943評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,057評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,773評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,106評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,082評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,282評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,793評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,507評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,741評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,220評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,929評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,325評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,661評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,482評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,702評論 2 380