以前整理的一些mysql方面內容,適合作備忘,由於我基本不會去記這些概念性的東西,你們作個瞭解就能夠了。css
一、數據庫:mysql
物理操做系統文件或其餘形式文件類型的集合。 在MySQL數據庫中, 數據庫文件能夠是frm、 MYD、 MYI、 ibd結尾的文件。 當使用NDB引擎時, 數據庫的文件可能不是操做系統上的文件, 而是存放於內存之中的文件, 可是定義仍然不變。算法
二、實例:sql
MySQL數據庫由後臺線程以及一個共享內存區組成。 共享內存能夠被運行的後臺線程所共享。 須要牢記的是, 數據庫實例纔是真正用於操做數據庫文件的。數據庫
這兩個詞有時能夠互換使用, 不過二者的概念徹底不一樣。 在MySQL數據庫中, 實例與數據庫的關係一般是一一對應的, 即一個實例對應一個數據庫, 一個數據庫對應一個實例。 可是, 在集羣狀況下可能存在一個數據庫被多個數據實例使用的狀況。緩存
MySQL被設計爲一個單進程多線程架構的數據庫, 這點與SQL Server比較相似, 但與Oracle多進程的架構有所不一樣( Oracle的Windows版本也是單進程多線程架構的) 。 這也就是說, MySQL數據庫實例在系統上的表現就是一個進程。安全
三、mysql配置文件服務器
當啓動實例時, MySQL數據庫會去讀取配置文件, 根據配置文件的參數來啓動數據庫實例。這與Oracle的參數文件( spfile) 類似, 不一樣的是, Oracle中若是沒有參數文件, 在啓動實例時會提示找不到該參數文件, 數據庫啓動失敗。 而在MySQL數據庫中, 能夠沒有配置文件, 在這種狀況下, MySQL會按照編譯時的默認參數設置啓動實例。 用如下命令能夠查看當MySQL數據庫實例啓動時, 會在哪些位置查找配置文件。網絡
MySQL數據庫是按/etc/my.cnf→/etc/mysql/my.cnf→/usr/local/mysql/etc →~/.my.cnf的順序讀取配置文件的。 可能若是幾個配置文件中都有同一個參數,MySQL數據庫以哪一個配置文件爲準?MySQL數據庫會以讀取到的最後一個配置文件中的參數爲準。 在Linux環境下, 配置文件通常放在/etc/my.cnf下。 在Windows平臺下, 配置文件的後綴名多是.cnf, 也多是.ini。多線程
從概念上來講, 數據庫是文件的集合,是依照某種數據模型組織起來並存放於二級存儲器中的數據集合; 數據庫實例是程序, 是位於用戶與操做系統之間的一層數據管理軟件, 用戶對數據庫數據的任何操做, 包括數據庫定義、 數據查詢、 數據維護、 數據庫運行控制等都是在數據庫實例下進行的, 應用程序只有經過數據庫實例才能和數據庫打交道。
更爲直白的方式來解釋: 數據庫是由一個個文件組成( 通常來講都是二進制的文件) 的,要對這些文件執行諸如SELECT、 INSERT、UPDATE和DELETE之類的數據庫操做是不能經過簡單的操做文件來更改數據庫的內容, 須要經過數據庫實例來完成對數據庫的操做。
MySQL由如下幾部分組成:
❑鏈接池組件
❑管理服務和工具組件
❑SQL接口組件
❑查詢分析器組件
❑優化器組件
❑緩衝( Cache) 組件
❑插件式存儲引擎
❑物理文件
MySQL數據庫區別於其餘數據庫的最重要的一個特色就是其插件式的表存儲引擎。 MySQL插件式的存儲引擎架構提供了一系列標準的管理和服務支持, 這些標準與存儲引擎自己無關, 多是每一個數據庫系統自己都必需的, 如SQL分析器和優化器等, 而存儲引擎是底層物理結構的實現, 每一個存儲引擎開發者能夠按照本身的意願來進行開發。
須要特別注意的是, 存儲引擎是基於表的,而不是數據庫。
一、InnoDB存儲引擎
InnoDB存儲引擎支持事務, 其設計目標主要面向在線事務處理( OLTP) 的應用。 其特色是行鎖設計、 支持外鍵, 並支持相似於Oracle的非鎖定讀, 即默認讀取操做不會產生鎖。 從MySQL數據庫5.5.8版本開始, InnoDB存儲引擎是默認的存儲引擎。
InnoDB存儲引擎將數據放在一個邏輯的表空間中, 這個表空間就像黑盒同樣由InnoDB存儲引擎自身進行管理。 從MySQL 4.1版本開始, 它能夠將每一個InnoDB存儲引擎的表單獨存放到一個獨立的ibd文件中。 此外, InnoDB存儲引擎支持用裸設備( row disk) 用來創建其表空間。
InnoDB經過使用多版本併發控制( MVCC)來得到高併發性, 而且實現了SQL標準的4種隔離級別, 默認爲REPEATABLE級別。 同時, 使用一種被稱爲next-key locking的策略來避免幻讀( phantom) 現象的產生。 除此以外, InnoDB儲存引擎還提供了插入緩衝( insert buffer) 、 二次寫( double write) 、 自適應哈希索引( adaptivehash index) 、 預讀( read ahead) 等高性能和高可用的功能。
對於表中數據的存儲, InnoDB存儲引擎採用了彙集( clustered) 的方式, 所以每張表的存儲都是按主鍵的順序進行存放。 若是沒有顯式地在表定義時指定主鍵, InnoDB存儲引擎會爲每一行生成一個6字節的ROWID, 並以此做爲主鍵。
InnoDB存儲引擎是MySQL數據庫最爲經常使用的一種引擎, 而Facebook、 Google、 Yahoo! 等公司的成功應用已經證實了InnoDB存儲引擎具有的高可用性、 高性能以及高可擴展性。
二、MyISAM存儲引擎
MyISAM存儲引擎不支持事務、 表鎖設計,支持全文索引, 主要面向一些OLAP數據庫應用。 在MySQL 5.5.8版本以前MyISAM存儲引擎是默認的存儲引擎( 除Windows版本外) 。 數據庫系統與文件系統很大的一個不一樣之處在於對事務的支持, 然而MyISAM存儲引擎是不支持事務的。 究其根本, 這也不是很難理解。 試想用戶是否在全部的應用中都須要事務呢? 在數據倉庫中, 若是沒有ETL這些操做, 只是簡單的報表查詢是否還須要事務的支持呢? 此外, MyISAM存儲引擎的另外一個不同凡響的地方是它的緩衝池只緩存( cache) 索引文件, 而不緩衝數據文件, 這點和大多數的數據庫都很是不一樣。
MyISAM存儲引擎表由MYD和MYI組成,MYD用來存放數據文件, MYI用來存放索引文件。 能夠經過使用myisampack工具來進一步壓縮數據文件, 由於myisampack工具使用赫夫曼( Huffman) 編碼靜態算法來壓縮數據, 所以使用myisampack工具壓縮後的表是隻讀的, 固然用戶也能夠經過myisampack來解壓數據文件。
在MySQL 5.0版本以前, MyISAM默認支持的表大小爲4GB, 若是須要支持大於4GB的MyISAM表時, 則須要制定MAX_ROWS和AVG_ROW_LENGTH屬性。 從MySQL 5.0版本開始, MyISAM默認支持256TB的單表數據, 這足夠知足通常應用需求。
三、NDB存儲引擎
2003年, MySQL AB公司從Sony Ericsson公司收購了NDB集羣引擎 。 NDB存儲引擎是一個集羣存儲引擎, 相似於Oracle的RAC集羣, 不過與Oracle RAC share everything架構不一樣的是, 其結構是share nothing的集羣架構, 所以能提供更高的可用性。 NDB的特色是數據所有放在內存中( 從MySQL 5.1版本開始, 能夠將非索引數據放在磁盤上) , 所以主鍵查找( primary key lookups) 的速度極快, 而且經過添加NDB數據存儲節點( Data Node) 能夠線性地提升數據庫性能, 是高可用、 高性能的集羣系統。
關於NDB存儲引擎, 有一個問題值得注意,那就是NDB存儲引擎的鏈接操做( JOIN) 是在MySQL數據庫層完成的, 而不是在存儲引擎層完成的。 這意味着, 複雜的鏈接操做須要巨大的網絡開銷, 所以查詢速度很慢。 若是解決了這個問題, NDB存儲引擎的市場應該是很是巨大的。
注意 MySQL NDB Cluster存儲引擎有社區版本和企業版本兩種, 而且NDB Cluster已做爲Carrier Grade Edition單獨下載版本而存在。
四、Memory存儲引擎
Memory存儲引擎( 以前稱HEAP存儲引擎)將表中的數據存放在內存中, 若是數據庫重啓或發生崩潰, 表中的數據都將消失。 它很是適合用於存儲臨時數據的臨時表, 以及數據倉庫中的緯度表。 Memory存儲引擎默認使用哈希索引, 而不是咱們熟悉的B+樹索引。
雖然Memory存儲引擎速度很是快, 但在使用上仍是有必定的限制。 好比, 只支持表鎖, 併發性能較差, 而且不支持TEXT和BLOB列類型。 最重要的是, 存儲變長字段( varchar) 時是按照定長字段( char) 的方式進行的, 所以會浪費內存( 這個問題以前已經提到, eBay的工程師IgorChernyshev已經給出了patch解決方案) 。此外有一點容易被忽視, MySQL數據庫使用Memory存儲引擎做爲臨時表來存放查詢的中間結果集( intermediate result) 。 若是中間結果集大於Memory存儲引擎表的容量設置, 又或者中間結果含有TEXT或BLOB列類型字段, 則MySQL數據庫會把其轉換到MyISAM存儲引擎表而存放到磁盤中。 以前提到MyISAM不緩存數據文件, 所以這時產生的臨時表的性能對於查詢會有損失。
五、Archive存儲引擎
Archive存儲引擎只支持INSERT和SELECT操做, 從MySQL 5.1開始支持索引。 Archive存儲引擎使用zlib算法將數據行( row) 進行壓縮後存儲, 壓縮比通常可達1∶10。 正如其名字所示,Archive存儲引擎很是適合存儲歸檔數據, 如日誌信息。Archive存儲引擎使用行鎖來實現高併發的插入操做, 可是其自己並非事務安全的存儲引擎, 其設計目標主要是提供高速的插入和壓縮功能。
六、Federated存儲引擎
Federated存儲引擎表並不存放數據, 它只是指向一臺遠程MySQL數據庫服務器上的表。 這很是相似於SQL Server的連接服務器和Oracle的透明網關, 不一樣的是, 當前Federated存儲引擎只支持MySQL數據庫表, 不支持異構數據庫表。
七、Maria存儲引擎
Maria存儲引擎是新開發的引擎, 設計目標主要是用來取代原有的MyISAM存儲引擎, 從而成爲MySQL的默認存儲引擎。 Maria存儲引擎的開發者是MySQL的創始人之一的MichaelWidenius。 所以, 它能夠看作是MyISAM的後續版本。 Maria存儲引擎的特色是: 支持緩存數據和索引文件, 應用了行鎖設計, 提供了MVCC功能, 支持事務和非事務安全的選項, 以及更好的BLOB字符類型的處理性能。
八、其餘存儲引擎
除了上面提到的7種存儲引擎外, MySQL數據庫還有不少其餘的存儲引擎, 包括Merge、CSV、 Sphinx和Infobright, 它們都有各自使用的場合。
若是你們要學習mysql的話建議先從體系結構入手,一步一步去作深刻,概念性東西也須要了解下,這裏重點掌握innodb引擎和myisam引擎。
後面會分享更多devops和DBA方面內容,感興趣的朋友能夠關注下!!