第一章:MySQL體系結(jié)構(gòu)和存儲引擎
Mysql被設(shè)計為一個單進程多線程的架構(gòu)的數(shù)據(jù)庫病瞳,MySql數(shù)據(jù)庫實例在系統(tǒng)上的表現(xiàn)就是一個進程。
當我們啟動一個Mysql實例時套菜,MySQL數(shù)據(jù)庫會去讀取配置文件,根據(jù)配置文件的參數(shù)來啟動數(shù)據(jù)庫實例(這與Oracle的參數(shù)文件spfile相似蛹头,但不同的是戏溺,Oracle中如果沒有參數(shù)文件,在啟動實例時會提示找不到該參數(shù)文件旷祸,數(shù)據(jù)庫啟動會失敗。而在MySQL數(shù)據(jù)庫中骚烧,可以沒有配置文件闰围,這時MySQL會按編譯時默認的參數(shù)啟動實例),MySQL數(shù)據(jù)庫是按如下順序讀取配置文件的:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
~/.my.cnf
如果配置文件中有相同配置參數(shù)辫诅,則以最后一個配置文件中參數(shù)為準涧狮。
配置文件中有個參數(shù)datadir么夫,該參數(shù)指定了數(shù)據(jù)庫所在的路徑肤视,Linux系統(tǒng)下默認為usr/local/mysql/data
。
1.1 MySQL體系結(jié)構(gòu)
MySQL由以下幾部分組成:
- 連接池組件
- 管理服務(wù)和工具服務(wù)
- SQL接口組件
- 查詢分析器組件
- 優(yōu)化器組件
- 緩沖(cache)組件
- 插件式存儲引擎
- 物理文件
需要特別注意的是:存儲引擎是基于表的腐螟,而不是數(shù)據(jù)庫困后。
1.2 MySQL存儲引擎
存儲引擎是MySQL區(qū)別于其他數(shù)據(jù)庫的一個最重要特性,存儲引擎的好處是:每個存儲引擎都有各自的特點汽绢,能夠根據(jù)具體的應(yīng)用建立不同存儲引擎表侧戴,由于MySQL的開源特性,用戶還可以根據(jù)MySQL預(yù)定義的存儲引擎接口編寫自己的存儲引擎酗宋。
1.2.1 常見存儲引擎
-
InnoDB存儲引擎
????InnoDB存儲引擎支持事務(wù),其設(shè)計目標主要面向在線事務(wù)處理(OLTP)的應(yīng)用寂曹,其特點是行鎖設(shè)計回右、支持外鍵稀颁、并支持類似于Oracle的非鎖定讀(即默認讀取操作不會產(chǎn)生鎖)楣黍,Mysql數(shù)據(jù)庫從5.5.8版本開始將InnoDB設(shè)置為默認的存儲引擎。InnoDB存儲引擎將數(shù)據(jù)放在一個邏輯的表空間中阶女,這個表空間像一個黑盒一樣由InnoDB存儲引擎自行管理(InnoDB存儲引擎的表單獨存放到一個獨立的idb文件中)哩治。
????InnoDB通過使用多版本并發(fā)控制(MVCC)來獲得高并發(fā),并且實現(xiàn)了SQL標準的4種隔離級別业筏,默認為REPEATABLE級別。同時消别,使用next_key_locking策略來避免幻讀。除此之外寻狂,InnoDB存儲引擎還提供了插入緩存(insert buffer)、二次寫(double write)缀壤、自適應(yīng)哈希索引(adaptive hash index)纠亚、預(yù)讀(read ahead)等高性能和高可用的功能。
????對于表中數(shù)據(jù)的存儲蒂胞,InnoDB存儲引擎采用了聚集(clustered)的方式,因此每張表的存儲都是按主鍵的順序進行存放岳瞭,如果在表中沒有顯式的指定主鍵蚊锹,InnoDB存儲引擎會為每一行生成一個6個字節(jié)的ROWID,并以此作為主鍵牡昆。 -
MyISAM引擎
????MyISAM存儲引擎不支持事務(wù)、表鎖設(shè)計柱宦、支持全文索引播瞳,主要面向一些OLAP數(shù)據(jù)庫應(yīng)用。同時MyISAM存儲引擎的緩沖池值緩存索引文件赢乓,而不緩沖數(shù)據(jù)文件。
????MyISAM存儲引擎表由MYD和MYI組成蚓炬,MYD用來存放數(shù)據(jù)文件躺屁,MYI用來存放索引文件。
????在MySQL5.0之前的版本,MyISAM默認支持的表大小為4GB烁兰,如果需要支持大于4GB的MyISAM表時余耽,則需要制定MAX_ROWS和AVG_ROW_LENGTH屬性苹熏,而從MySQL5.0版本開始,MyISAM默認支持256TB的單表數(shù)據(jù)轨域,這足夠滿足一般應(yīng)用的需求。
????不難看出朱巨,MyISAM適合沒有更新操作枉长,只有查詢(例如統(tǒng)計、報表)的業(yè)務(wù)場景必峰,MyISAM現(xiàn)在用的已經(jīng)很少了。
注意:對于MyISAM存儲引擎表凭需,MySQL數(shù)據(jù)庫只緩存其索引文件肝匆,數(shù)據(jù)文件的緩存交由操作系統(tǒng)本身來完成,這與其他LRU算法緩存數(shù)據(jù)的大部分數(shù)據(jù)庫不同旗国。此外,在MySQL5.1.23版本之前嫁怀,無論是在32位還是64位操作系統(tǒng)環(huán)境下借浊,緩存索引的緩沖區(qū)最大只能設(shè)置為4GB,在之后的版本中蚂斤,64位的操作系統(tǒng)可以支持大于4GB的索引緩沖區(qū)。
-
NDB存儲引擎
????2003年捌治,MySQL AB公司從Sony Ericsson公司收購了NDB集群引擎。
????NDB存儲引擎是一個集群存儲引擎肖油,類似于Oracle的RAC集群,不過與Oracle RAC share everything架構(gòu)不同的是视搏,其結(jié)構(gòu)是share nothing的集群架構(gòu)县袱,因此能提供更高的可用性筋遭。
????NDB的特點是數(shù)據(jù)全部放在內(nèi)存中(MySQL5.1版本開始可以將非索引數(shù)據(jù)存放在磁盤上)乖篷,因此主鍵查找(primary key lookups)的速度極快踏施,并且通過添加NDB數(shù)據(jù)存儲節(jié)點(Data Node)可以線性的提高數(shù)據(jù)庫性能畅形,是高可用、高性能的集群系統(tǒng)肾胯。
????值得注意的是敬肚,NDB存儲引擎的連接操作(JOIN)是在MySQL數(shù)據(jù)庫層完成的员寇,而不是在存儲引擎層完成的,這意味著負責的連接操作需要巨大的網(wǎng)絡(luò)開銷,因此查詢速度很慢。 -
Memory存儲引擎
????Memory存儲引擎(之前稱為HEAP存儲引擎)將表中的數(shù)據(jù)存放到內(nèi)存中仔拟,如果數(shù)據(jù)庫重啟或宕機,表中的數(shù)據(jù)都將消失利花。它非常適合存儲臨時數(shù)據(jù)挠乳,Memory存儲引擎默認使用哈希索引卖怜,而不是我們熟悉的B+樹索引奄抽。
????雖然Memory存儲引擎速度非趁羁校快,但在使用上有一定的限制,比如它只支持表鎖腔稀,并發(fā)性能較差,并且不支持TEXT和BLOB類型瘟芝,更重要的是存儲變長字段(varchar)時是按照定長字段(char)的方式進行的,因此會浪費內(nèi)存。 -
Archive存儲引擎
????Archive存儲引擎只支持INSERT和SELECT操作,從MySQL 5.1開始支持索引叫榕。
????Archive存儲引擎使用zlib算法將數(shù)據(jù)行(row)進行壓縮后存儲,壓縮比一般可達1:10寓落。
????Archive存儲引擎非常適合存儲歸檔數(shù)據(jù)荞下,如日志信息等史飞,Archive存儲引擎使用行鎖來實現(xiàn)高并發(fā)的插入操作仰税,但是其本身不是事務(wù)安全的存儲引擎,其設(shè)計目標是提供高速的插入和壓縮功能吐绵。 -
Federated存儲引擎
????Federated存儲引擎表并不存放數(shù)據(jù)河绽,它只是指向一臺遠程MySQL數(shù)據(jù)庫服務(wù)器上的表,這非常類似于SQL Server的鏈接服務(wù)器和Oracle的透明網(wǎng)關(guān)耙饰,不同的是,當前的Fedrated存儲引擎只支持MySQL數(shù)據(jù)庫表廷痘,不支持異構(gòu)數(shù)據(jù)庫表削咆。 -
Maria存儲引擎
????Maria存儲引擎是新開發(fā)的存儲引擎蠢笋,設(shè)計目標主要是用來取代原有的MyISAM存儲引擎,從而成為MySQL的默認存儲引擎(存儲引擎的開發(fā)者是MySQL創(chuàng)始人之一的Michael Widenius昨寞,因此它可以看作是MyISAM的后續(xù)版本)
????Maria存儲引擎的特點是:支持緩存數(shù)據(jù)和索引文件、應(yīng)用了行鎖設(shè)計歼狼、提供了MVCC功能享怀、支持事務(wù)和非事務(wù)安全的選項、以及更好的BLOB字符類型的處理性能添瓷。 -
其他存儲引擎
MySQL還有Merge、CSV坯汤、Sphinx搀愧、Infobright存儲引擎疆偿,他們都有各自的特點和使用場景搓幌。
1.3各個存儲引擎的比較
如何查看自己當前使用的MySQL數(shù)據(jù)庫所支持的存儲引擎?
- 可以通過命令:
SHOW ENGINES
查看:
-
也可以通過查找information_schema中的ENGINES表查看