mysql是一個可移植的數據庫,幾乎能在當前全部操做系統上運行,如Linux,Mac,Windows等,儘管各類系統在底層(如線程)實現方面各有不一樣,可是mysql幾乎能保證在各平臺上的物理體系結構的一致性。node
定義數據庫和實例:
在數據庫領域中有兩個詞很容易混淆,它們就是實例(instance)和數據庫(database)。做爲常見的數據庫術語,這兩個詞的定義以下:
數據庫:物理操做系統文件或其它形式文件類型的集合。在mysql中,數據庫文件能夠是frm,myd,myi,idb結尾的文件。當使用NDB引擎時,數據庫的文件可能不是操做系統上的文件,而是存放於內存中的文件,可是定義仍然不變。
數據庫實例:由數據庫後臺進程/線程以及一個共享內存區組成。共享內存能夠被運行的後臺進程/線程所共享。須要牢記的是,數據庫實例纔是真正用來操做數據庫文件的。這兩個詞有時能夠互換使用,但二者的概念徹底不一樣。在MySQL中,實例和數據庫的一般關係是一一對應的,即一個實例對應一個數據庫,一個數據庫對應一個實例。可是,在集羣狀況下可能存在一個數據庫可被多個實例使用的狀況。mysql
mysql被設計爲一個單進程多線程架構的數據庫,這點與SqlServer比較相似,但與Oracle多進程的架構有所不一樣(Oracle的Windows版也是單進程多線程的架構)。這也就是說,mysql數據庫實例在系統上的表現就是一個進程。當啓動實例時,mysql數據庫會去讀取配置文件,根據配置文件的參數來啓動數據庫實例,這與Oracle的參數文件(spfile)類似,不一樣的是,在Oracle中若是沒有參數文件,啓動時會提示找不到該參數文件,數據庫啓動失敗。而在mysql數據庫中,能夠沒有配置文件,這種狀況下,mysql會按照編譯時的默認參數設置啓動實例。算法
在平常生活工做中咱們在談論mysql時,即mysql也是數據庫也是數據庫實例,你這樣理解Oracle和SqlServer多是正確的,但對於之後理解mysql體系結構中的存儲引擎可能會帶來問題。從概念上說數據庫是文件的集合,是依照某種數據模型組織起來並存放於二級存儲器中的數據集合,數據庫實例是應用程序,是位於用戶與操做系統之間的一層數據庫管理軟件,用戶對數據庫數據的任何操做,包括數據庫定義,數據查詢,數據維護,數據庫運行控制等,都是在數據庫實例下進行的,應用程序只有經過數據庫實例才能和數據庫打交道。在直白點就是數據庫是mysql存儲在磁盤上的文件,當咱們執行select,insert,update等操做,不能經過簡單的操做文件來更改數據庫的內容,須要經過數據庫實例來完成對數據庫的操做。sql
mysql是插件式體系結構,存儲引擎是mysql區別於其它數據庫的一個重要特性。存儲引擎的好處是,每一個存儲引擎都有各自的特色,可以根據具體的應用創建不一樣的存儲引擎表。對於開發人員來講,存儲引擎對其是透明的,但瞭解各類存儲引擎的卻別對開發人員來講是有好處的。
mysql是開源的能夠根據mysql預約義的存儲引擎結果編寫本身的存儲引擎,若是你對某種存儲引擎不滿意,能夠經過修改源碼來實現本身想要的特性。下面是一些常見的存儲引擎:數據庫
InnoDB存儲引擎
InnoDB存儲引擎支持事物,主要面向在線事物處理(OLTP)方面的應用,其特色是行鎖設計,支持外鍵,並支持相似於Oracle的非鎖定讀,即默認狀況下讀取操做不會產生鎖。mysql在Windows版本下innoDB是默認存儲引擎,同時innoDB默認被包含在全部的mysql二進制發佈版本中。
innoDB存儲引擎將數據放在一個邏輯的表空間中,這個表空間就像黑盒同樣由innoDB自身進行管理。它能夠將每一個innoDB存儲引擎的表單獨存放到一個獨立的idb文件中,與Oracle相似,innoDB存儲引擎一樣可使用裸設備來創建表空間。
innoDB經過使用多版本併發控制(MVCC)來得到高併發性,而且實現了sql標準的4種隔離級別,默認爲REPEATABLE級別,同時使用一種被稱爲next-key locking的策略來避免幻讀(phantom)現象的產生。除此以外,innoDB存儲引擎還提供了插入緩衝(insert buffer),二次寫(double write),自適應哈希索引(adaptive hash index),預讀(read ahead)等高性能和高可用的功能。
對於表中的存儲,innoDB存儲引擎採用了彙集(clustered)的方式,這種方式相似於Oracle的索引彙集表(index organized table,IOT)。每張表的存儲都按主鍵的順序存放,若是沒有顯示的在表定義時指定主鍵,innoDB存儲引擎會爲每一行生成一個6字節的ROWID,並以此做爲主鍵。緩存
MyISAM存儲引擎
MyISAM存儲引擎時mysql官方提供的存儲引擎,其特色是不支持事物,表鎖和全文索引,對於一些OLAM(online analytical processing 在線分析處理)操做速度快。除Windows版本外,是全部mysql版本默認的存儲引擎。
MyISAM存儲引擎表由MYD和MYI組成,MYD用來存放數據文件,MYI用來存放索引文件。能夠經過使用myisampack工具來進一步壓縮數據文件,由於myisampack工具使用赫夫曼編碼靜態算法來壓縮數據,所以使用myisampack工具壓縮後的表示只讀的,固然你也能夠經過myisampack來解壓數據文件。
在mysql5.0版本之前,MyISAM默認支持的表大小爲4G,若是須要支持大於4G的MyISAM表時,須要指定MAX_ROWS和AVG_ROW_LENGTH屬性。mysql5.0版本開始,MyISAM默認支持256T的單表數據,這足夠知足通常應用的需求。安全
NDB存儲引擎
NDB存儲引擎是一個集羣存儲引擎,相似於Oracle的RAC集羣。不過與Oracle RAC share everything結構不一樣的是,其結構是share nothing的集羣架構,所以還能提供更高級別的高可用性。NDB的特色是數據所有放在內存中,所以主鍵查找(primary key lookup)的速度極快,而且經過添加NDB數據存儲節點(data node)能夠線性的提升數據庫性能,是高可用,高性能的集羣系統。
NDB存儲引擎的鏈接操做時在mysql數據庫層完成的,而不是在存儲引擎層完成的,這意味着,複雜的鏈接操做須要巨大的網絡開銷,所以查詢速度很慢。服務器
Memory存儲引擎
memory存儲引擎將表中的數據存放在內存中,若是數據庫重啓或發生崩潰,表中的數據都將消失。它很是適合用於存儲臨時數據的臨時表,以及數據庫中的緯度表。它默認使用哈希索引,而不是咱們熟悉的B+樹索引。
雖然memory存儲引擎速度很是快,但在使用上仍是有必定的限制。好比其只支持表鎖,併發性能較差,而且不支持TEXT和BLOB列類型。最重要的是,存儲變長字段(varchar)時是按照定長字段(char)的方式進行的,所以會浪費內存。
此外有一點長被忽略的是,mysql數據庫使用memory存儲引擎做爲臨時表來存放查詢的中間結果集。若是中間結果集大於memory存儲引擎表的容量設置,又或者中間結果含有TEXT或BLOB列類型字段,則mysql數據庫會把其轉換到MyISAM存儲引擎表而存放到磁盤。網絡
Archive存儲引擎
archive存儲引擎只支持INSERT和SELECT操做,mysql5.1開始支持索引。其使用zlib算法將數據行進行壓縮後存儲,壓縮比率通常可達1:10.正如其名稱所示,archive存儲引擎很是適合存儲歸檔數據,如日誌信息。archive存儲引擎使用行鎖來實現高併發的插入操做,可是自己並非事物安全的存儲引擎,其設計目標主要是提供高速的插入和壓縮功能。多線程
federated存儲引擎
federated存儲引擎表並不存放數據,它只是指向一臺遠程mysql數據庫服務器上的表。這很是相似於sql server的鏈接服務器和Oracle的透明網管,不一樣的是,當前federated存儲引擎只支持mysql數據庫表,不支持異構數據庫表。
Maria存儲引擎
Maria存儲引擎時新開發的引擎,設計目標主要是用來取代原有的MyISAM存儲引擎,從而成爲mysql的默認存儲引擎,其特色是緩存數據和索引文件,航所設計,提供MVCC功能,支持事物和非事物安全的選項支持,以及更好的OLOB字符類型的處理性能。
數據庫系統 (DataBase System, DBS)。
數據庫管理系統(DataBase Management System, DBMS)。
關係型數據庫(Relational database,RDS):Oracle、MySQL、MariaDB、Percona Server for MySQL、DB2
非關係型數據庫(Not Only SQL,NoSQL):Memcache、Redis、MongoDB、
結構化查詢語言(Structured Query Language):
DDL(Data Definition Language):數據定義語言其語句包括動詞CREATE和DROP。在數據庫中建立新表或刪除表(CREAT TABLE 或 DROP TABLE),爲表加入索引等。DDL包括許多與人數據庫目錄中得到數據有關的保留字。它也是動做查詢的一部分。
DML(Data Manipulation Language):數據操做語言其語句包括動詞INSERT,UPDATE和DELETE。它們分別用於添加,修改和刪除表中的行。也稱爲動做查詢語言。
DQL(Data Query Language):數據查詢語言也稱爲「數據檢索語句」,從表中得到數據,保留字SELECT是DQL(也是全部SQL)用得最多的動詞,其餘DQL經常使用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其餘類型的SQL語句一塊兒使用。
DCL(Data Control Language):數據控制語言它的語句經過GRANT或REVOKE得到許可,肯定單個用戶和用戶組對數據庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對錶單個列的訪問。
TPL(Transaction Processing Language):事務處理語言它的語句能確保被DML語句影響的表的全部行及時得以更新。TPL語句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。