mysql架構與存儲引擎 (Myisam與Innodb)

mysql抽象架構:能夠分爲SQL Layer和Storage Engine Layerhtml

mysql的engine層是基於表的,不是基於庫的,建立表的語句能夠指定enginemysql

Mysql的架構sql

 Mysql 架構器中各個模塊都是什麼?數據庫

(1)、鏈接管理與安全驗證是什麼?緩存

每一個客戶端都會創建一個與服務器鏈接的線程,服務器會有一個線程池來管理這些 鏈接;若是客戶端須要連接到 MYSQL 數據庫還須要進行驗證,包括用戶名、密碼、 主機信息等。安全

(2)、解析器是什麼?服務器

解析器的做用主要是分析查詢語句,最終生成解析樹;首先解析器會對查詢語句的語法進行分析,分析語法是否有問題。還有解析器會查詢緩存,若是在緩存中有對應的語句,就返回查詢結果不進行接下來的優化執行操做。前提是緩存中的數據沒有被修改,固然若是被修改了也會被清出緩存。架構

(3)、優化器怎麼用?併發

優化器的做用主要是對查詢語句進行優化操做,包括選擇合適的索引,數據的讀取方式,包括獲取查詢的開銷信息,統計信息等,這也是爲何圖中會有優化器指向存儲引擎的箭頭。以前在別的文章沒有看到優化器跟存儲引擎之 間的關係,在這裏我我的的理解是由於優化器須要經過存儲引擎獲取查詢的大體數據和統計信息。nosql

(4)、執行器是什麼?

執行器包括執行查詢語句,返回查詢結果,生成執行計劃包括與存儲引擎的一些處理操做。 

MyIsam和InnoDB兩個存儲引擎

Innodb與Myisam,不論是關係型數據庫(rdbms)仍是nosql,數據都存儲在文件中。mysql數據存儲在data下,一個數據庫對應一個文件夾。

  InnoDB Myisam
存儲文件

.frm 表定義文件

.ibd 數據文件

.frm 表定義文件

.myd 數據文件

.myi 索引文件

行鎖、表鎖 表鎖
事務 ACID 不支持
CRDU 讀、寫 讀多
count 掃表 專門存儲的地方
索引結構 B+樹 B+樹
  • 存儲結構:每一個MyISAM在磁盤上存儲成三個文件:第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義,數據文件的擴展名爲.MYD (MYData),索引文件的擴展名是.MYI (MYIndex)。InnoDB全部的表都保存在同一個數據文件中(也多是多個文件,或者是獨立的表空間文件),InnoDB表的大小隻受限於操做系統文件的大小,通常爲2GB。
  • 存儲空間:MyISAM可被壓縮,佔據的存儲空間較小,支持靜態表、動態表、壓縮表三種不一樣的存儲格式。InnoDB須要更多的內存和存儲,它會在主內存中創建其專用的緩衝池用於高速緩衝數據和索引。
  • 可移植性、備份及恢復:MyISAM的數據是以文件的形式存儲,因此在跨平臺的數據轉移中會很方便,同時在備份和恢復時也可單獨針對某個表進行操做。InnoDB免費的方案能夠是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十G的時候就相對痛苦了。
  • 事務支持:MyISAM強調的是性能,每次查詢具備原子性,其執行數度比InnoDB類型更快,可是不提供事務支持。InnoDB提供事務、外鍵等高級數據庫功能,具備事務提交、回滾和崩潰修復能力。
  • AUTO_INCREMENT:在MyISAM中,能夠和其餘字段一塊兒創建聯合索引。引擎的自動增加列必須是索引,若是是組合索引,自動增加能夠不是第一列,它能夠根據前面幾列進行排序後遞增。InnoDB中必須包含只有該字段的索引,而且引擎的自動增加列必須是索引,若是是組合索引也必須是組合索引的第一列。
  • 表鎖差別:MyISAM只支持表級鎖,用戶在操做MyISAM表時,select、update、delete和insert語句都會給表自動加鎖,若是加鎖之後的表知足insert併發的狀況下,能夠在表的尾部插入新的數據。InnoDB支持事務和行級鎖。行鎖大幅度提升了多用戶併發操做的新能,可是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的。
  • 全文索引:MyISAM支持 FULLTEXT類型的全文索引;InnoDB不支持FULLTEXT類型的全文索引,可是innodb可使用sphinx插件支持全文索引,而且效果更好。
  • 表主鍵:MyISAM容許沒有任何索引和主鍵的表存在,索引都是保存行的地址。對於InnoDB,若是沒有設定主鍵或者非空惟一索引,就會自動生成一個6字節的主鍵(用戶不可見),數據是主索引的一部分,附加索引保存的是主索引的值。
  • 表的具體行數:MyISAM保存表的總行數,select count() from table;會直接取出出該值;而InnoDB沒有保存表的總行數,若是使用select count() from table;就會遍歷整個表,消耗至關大,可是在加了wehre條件後,myisam和innodb處理的方式都同樣。
  • CURD操做:在MyISAM中,若是執行大量的SELECT,MyISAM是更好的選擇。對於InnoDB,若是你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表。DELETE從性能上InnoDB更優,但DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除,在innodb上若是要清空保存有大量數據的表,最好使用truncate table這個命令。
  • 外鍵:MyISAM不支持外鍵,而InnoDB支持外鍵。

  經過上述的分析,基本上能夠考慮使用InnoDB來替代MyISAM引擎了,緣由是InnoDB自身不少良好的特色,好比事務支持、存儲過程、視圖、行級鎖、外鍵等等。尤爲在併發不少的狀況下,相信InnoDB的表現確定要比MyISAM強不少。另外,必須須要注意的是,任何一種表都不是萬能的,合適的纔是最好的,才能最大的發揮MySQL的性能優點。若是是不復雜的、非關鍵的Web應用,仍是能夠繼續考慮MyISAM的,這個具體狀況具體考慮。

總結:

InnoDB自身不少良好的特色,好比事務支持、存儲 過程、視圖、行級鎖定等等,在併發不少的狀況下,InnoDB的表現確定要比MyISAM強不少。可是,任何一種表都不是萬能的,只用恰當的針對業務類型來選擇合適的表類型,才能最大的發揮MySQL的性能優點。

B+Tree與B Tree的區別:

B-Tree的key和data是一塊兒的,B+Tree作了改進將data都放在了葉子節點,全部的中間節點都是key(想要學習B+樹的小夥伴能夠看看 http://blog.codinglabs.org/articles/theory-of-mysql-index.html
Inoodb與Myisam下的索引存儲圖:

 

 Mysiam中主索引和副索引的葉子節點都指向數據文件中的地址。

Inoodb中數據是附在葉子節點上的,查詢主索引會直接定位到葉子節點的數據。而查詢副索引會進行兩次查詢,先查詢到副索引葉子節點對應的主索引值,在經過主索引查詢數據。select * from table where id = (select id from table where name="mic")

相關文章
相關標籤/搜索