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+樹 |
經過上述的分析,基本上能夠考慮使用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")