mysql抽象架構:可以分爲SQL Layer和Storage Engine Layer
mysql的engine層是基於表的,不是基於庫的,創建表的語句可以指定engine
Mysql的架構
Mysql 架構器中各個模塊都是什麼?
(1)、連接管理與安全驗證是什麼?
每個客戶端都會建立一個與服務器連接的線程,服務器會有一個線程池來管理這些 連接;如果客戶端需要連接到 MYSQL 數據庫還需要進行驗證,包括用戶名、密碼、 主機信息等。
(2)、解析器是什麼?
解析器的作用主要是分析查詢語句,最終生成解析樹;首先解析器會對查詢語句的語法進行分析,分析語法是否有問題。還有解析器會查詢緩存,如果在緩存中有對應的語句,就返回查詢結果不進行接下來的優化執行操作。前提是緩存中的數據沒有被修改,當然如果被修改了也會被清出緩存。
(3)、優化器怎麼用?
優化器的作用主要是對查詢語句進行優化操作,包括選擇合適的索引,數據的讀取方式,包括獲取查詢的開銷信息,統計信息等,這也是爲什麼圖中會有優化器指向存儲引擎的箭頭。之前在別的文章沒有看到優化器跟存儲引擎之 間的關係,在這裏我個人的理解是因爲優化器需要通過存儲引擎獲取查詢的大致數據和統計信息。
(4)、執行器是什麼?
執行器包括執行查詢語句,返回查詢結果,生成執行計劃包括與存儲引擎的一些處理操作。
MyIsam和InnoDB兩個存儲引擎
Innodb與Myisam,不管是關係型數據庫(rdbms)還是nosql,數據都存儲在文件中。mysql數據存儲在data下,一個數據庫對應一個文件夾。
InnoDB | Myisam | |
存儲文件 |
.frm 表定義文件 .ibd 數據文件 |
.frm 表定義文件 .myd 數據文件 .myi 索引文件 |
鎖 | 行鎖、表鎖 | 表鎖 |
事務 | ACID | 不支持 |
CRDU | 讀、寫 | 讀多 |
count | 掃表 | 專門存儲的地方 |
索引結構 | B+樹 | B+樹 |
1.存儲結構
Innodb有兩個存儲文件,.frm表定義文件與.ibd數據文件 其中ibd文件中存儲了數據與索引信息,而Myisam中則使用了三個文件,將數據與索引分開存儲。
2.表鎖差異
MyISAM:只支持表級鎖,用戶在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以後的表滿足insert併發的情況下,可以在表的尾部插入新的數據。
InnoDB:支持事務和行級鎖,是innodb的最大特色。行鎖大幅度提高了多用戶併發操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的。
3、事務
Innodb支持事務原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability) Myisam強調的是性能,每次查詢具有原子性,其執行數度比InnoDB類型更快,但是不提供事務支持
4.CRUD操作
MyISAM:如果執行大量的SELECT,MyISAM是更好的選擇。
InnoDB:如果你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表。DELETE 從性能上InnoDB更優,但DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除,在innodb上如果要清空保存有大量數據的表,最好使用truncate table這個命令。
5.count操作
當count(*)時,Inoodb需要進行掃表查詢數量,消耗非常大。而Myisam中存儲了count信息可以直接取出該值。
如果加了where條件,這兩個索引處理方式就一樣了。
6.索引結構都是B+Tree
衡量一個索引好不好的關鍵是IO漸進複雜度,B+Tree樹的高度是可控的,可以降低IO漸進複雜度。
7. 外鍵
MyISAM:不支持
InnoDB:支持
8、 表主鍵
MyISAM:允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
InnoDB:如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6字節的主鍵(用戶不可見),數據是主索引的一部分,附加索引保存的是主索引的值。
9、 全文索引
MyISAM:支持 FULLTEXT類型的全文索引
InnoDB:不支持FULLTEXT類型的全文索引,但是innodb可以使用sphinx插件支持全文索引,並且效果更好。
總結:
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")