上圖來自官方手冊html
組成部分:
1.鏈接池組件
2.管理服務和工具組件
3.Sql接口組件
4.查詢分析器組件
5.優化器組件
6.緩衝組件
7.插件式存儲引擎(與其餘數據庫的主要區別)
8.物理文件mysql
MySQL數據庫區別與其餘數據庫最重要的一個特色就是其插件式的表存儲引擎,MySQL插件式的表存儲引擎,MySQL插件式的存儲引擎結構提供了一系列標準的管理和服務支持,這些標準與存儲引擎自己無關,多是每一個數據庫系統自己都必須的,例如SQL分析器和優化器等,而存儲引擎是底層物理結構的實現,每一個存儲引擎開發者能夠按照本身的意願來進行開發;算法
須要特別注意的是,存儲引擎是基於表的,而不是數據庫;sql
MySQL的體系結構能夠分爲兩層,MySQL Server層和存儲引擎層,在MySQL Server層中又包括鏈接層和SQL層;數據庫
一、鏈接層緩存
應用程序經過接口(如ODBC、JDBC)來鏈接MySQL,最早鏈接處理的是鏈接層,鏈接層包括通訊協議、線程處理、用戶名密碼認證三個部分.通訊協議負責檢測客戶端版本是否與服務端兼容,線程處理是指每個鏈接請求都會分配一個對應獨立的線程,用戶名密碼認證驗證建立的帳號和密碼,以及host主機受權是否能夠鏈接到MySQL服務器;
二、SQL層安全
SQL層包含權限判斷、查詢緩存、解析器、預處理、查詢優化器、緩存和執行計劃; 1) 權限判斷能夠審覈用戶有沒有訪問某個庫、某個表,或者表裏某行的權限. 2) 查詢緩存經過Query Cache進行操做,若是數據在Query Cache中,則直接返回結果給客戶端; 3) 查詢解析器針對SQL語句進行解析,判斷語法是否正確‘ 4) 預處理器對解析器沒法解析的語義進行處理; 5) 優化器對SQL語句進行改寫和相應的優化,並生成最優的執行計劃; 而後就能夠調用程序的API接口,經過存儲引擎層訪問數據;
三、存儲引擎層服務器
MySQL數據庫的核心就在於存儲引擎;併發
MySQL數據庫是開源的,因此用戶能夠根據MySQL預約義的存儲引擎接口編寫本身的存儲引擎,若是對現有存儲引擎的性能或功能不滿意,能夠經過修改源碼來獲得想要的特性,這就是開源的力量;ide
存儲引擎能夠分爲MySQL官方存儲引擎和第三方存儲引擎,InnoDB存儲引擎早期就是第三方存儲引擎,後來被Oracle收購,同時也是MySQL數據量OLTP在線事務處理應用最普遍的存儲引擎;
一、InnoDB存儲引擎 InnoDB存儲引擎支持事務、其設計目標主要面向在線事務處理(OLTP)的應用,其特色是行鎖設計、支持外鍵,並支持相似於Oracle的非鎖定讀,即默認讀取操做不會產生鎖,從MySQL數據庫5.58版本開始,InnoDB存儲引擎是默認的存儲引擎; InnoDB存儲引擎將數據存放在一個邏輯的表空間中,這個表空間就像黑盒同樣由InnoDB存儲引擎自身進行管理,從MySQL4.1(包括4.1)版本開始,它能夠將每一個InnoDB存儲引擎的表單獨存放到一個獨立的ibd文件中,此外,InnoDB存儲引擎支持用裸設備(row disk)用來創建其表空間; InnoDB存儲引擎經過使用多版本併發控制(MVCC)來得到高併發性,而且實現了SQL標準的4種隔離級別,默認爲REPEATABLE級別,同時,使用一種被稱爲next-key locking的策略來避免幻讀(phantom)現象的產生,除此以外,InnoDB存儲引擎還提供了插入緩衝(insert buffer)、二次寫(double write)、自適應哈希索引(adaptive hash index)、預讀(read ahead)等高性能和高可用的功能; 對於表中的數據存儲,InnoDB存取引擎採用來彙集(clustered)的方式,所以每張表的存儲都是按主鍵的順序進行存放,若是沒有顯示地在表定義時指定主鍵,InnoDB存儲引擎會爲每一行生成一個6字節的ROWID,並以此做爲主鍵; 二、MyISAM存儲引擎 MyISAM存儲引擎不支持事務、表鎖設計,支持全文索引,主要面向一些OLAP數據應用,在MySQL5.58版本以前MyISAM存儲引擎是默認的存儲引擎(除Windows版本外),數據庫系統與文件系統很大的一個不一樣之處在於對事務的支持,然而MyISAM存儲引擎是不支持事務的,這個也不是很難理解,試想一下用戶是否在全部的應用中都須要事務呢?在數據倉庫中,若是沒有ETL這些操做,只是簡單的報表查詢是否還須要事務的支持呢?此外,MyISAM存儲引擎的另外一個不同凡響的地方是它的緩衝池只緩存(cache)索引文件,而不是緩衝數據文件,這一點和大多數的數據庫都很是不一樣; MyISAM存儲引擎表由MYD和MYI組成,MYD用來存放數據文件,MYI用來存放索引文件,能夠經過使用myisampack工具來進一步壓縮數據文件,由於myisampack工具使用赫夫曼(Huffman)編碼靜態算法來壓縮數據,所以使用myisampack工具壓縮後的表是隻讀的,也能夠經過myisampack來解壓數據文件; 在MySQL5.0版本以前,MyISAM默認支持的表大小爲4GB,若是須要支持大於4GB的MyISAM表時,則須要指定MAX_WORS和AVG_ROW_LENGTH屬性,從MySQL5.0版本開始,MyISAM默認支持256TB的但表數據,這足夠知足通常應用需求; 注意:對於MyISAM存儲引擎表,MySQL數據只緩存其索引文件,數據文件的緩存交由操做系統自己來完成,這與其餘使用LRU算法緩存數據的大部分數據庫大不相同,此外,在MySQL5.1.23版本以前,不管是在32位仍是64位操做系統環境中,緩存索引的緩衝區最大隻能設置爲4GB,在此以後的版本中,64位系統能夠支持大於4GB的索引緩衝區了; 三、Memory存儲引擎 Memory存儲引擎(以前稱HEAP存儲引擎)將表中的數據存放在內存中,若是數據庫重啓或者發生崩潰,表中的數據都將消失,它很是適合用於存儲臨時數據的臨時表,以及數據倉庫中的緯度表,Memory存儲引擎默認私用哈希索引,而不是B+數索引; 雖然Memory存儲引擎速度很是快,可是在使用上仍是有必定的限制,好比,只支持表鎖,併發性能較差,而且不支持TEXT和BLOB列類型,最重要的是,存儲變長字段(varchar)時是按照定長地段(char)的方式進行的,所以會浪費內存; 還有一點,MySQL數據庫使用Memory存儲引擎做爲臨時表來存放查詢的中間結果集(intermediate result),若是中間結果集大於Memory存儲引擎表的容量設置,又或者中間結果含有TEXT或BLOB列類型字段,則MySQL數據庫會把其轉換到MyISAM存儲引擎表而存放到磁盤中; 四、Archive存儲引擎 Archive存儲引擎只支持INSERT和SELECT操做,從MySQL5.1開始支持索引,Archive存儲引擎使用zlib算法將數據行(row)進行壓縮存儲,壓縮比通常可達1:10,正如其名字所示,Archive存儲引擎很是適合存儲歸檔數據,如日誌信息,Archive存儲引擎使用行鎖來實現高併發的插入操做,可是其自己並非事務安全的存儲引擎,其設計目標主要是提供高速的插入和壓縮功能; 五、Meria存儲引擎 Maria存儲引擎是新開發的引擎,設計目標主要是用來取代原有的MyISAM存儲引擎,從而成爲MySQL的默認存儲引擎,Mria存取引擎的開發者是MySQL的創始人之一的Michael Widenius,所以,它能夠看作是MyISAM的後續版本,Maria存儲引擎的特色是:支持緩存數據和索引文件,應用了行鎖設計,提供MVCC功能,支持事務和非事務安全的選項,以及更好的BLOB字符類型的處理性能;
show enginesG;
一、下載MySQL官方提供的示例庫
爲了測試,有時候須要大量的數據集,MySQL 官方提供了用於測試的示例數據庫 下載地址爲:https://dev.mysql.com/doc/index-other.html
二、解壓
解壓後,獲得 3 個文件,只須要用到兩個: sakila-schema.sql :數據庫結構文件 sakila-data.sql: 數據文件
三、導入MySQL
mysql> source /home/data/sakila-db/sakila-schema.sql; mysql> source /home/data/sakila-db/sakila-data.sql;
未完待續..