感覺好久沒有看MySQL相關(guān)的書了,最近邊復(fù)習(xí),邊整理下感覺重要的知識點,一點點的由簡入繁,先從整體概念上理解下,擴充下整個知識圖譜。
一、MySQL 體系結(jié)構(gòu)

基礎(chǔ)中有兩個重要概念,數(shù)據(jù)庫和數(shù)據(jù)庫實例。
數(shù)據(jù)庫:文件的集合,依照某種數(shù)據(jù)模型組織并存放于二級存儲器中的數(shù)據(jù)集合。
數(shù)據(jù)庫實例:是程序,位于用戶與操作系統(tǒng)之間的一層數(shù)據(jù)庫管理軟件,用戶對于數(shù)據(jù)庫的任何操作(DML,DDL)都是在數(shù)據(jù)庫實例下進行的,應(yīng)用程序只有通過數(shù)據(jù)庫實例才能和數(shù)據(jù)庫打交道。
看了,最開始的架構(gòu)圖,可以了解到MySQL 由以下組成
1、連接池組件
2、管理和工具組件
3、接口組件
4、解析器組件
5、優(yōu)化器組件
6、緩存組件
7、插件式的存儲引擎
8、物理文件
注意:存儲引擎是基于表,而不是數(shù)據(jù)庫
二、存儲引擎
下面介紹幾個重要的存儲引擎的特點
1、InnoDB
特點:
支持事物,主要面向在線數(shù)據(jù)處理OLTP
-
支持行鎖設(shè)計
- 分為共享鎖和排它鎖
- 行鎖有基本的三種算法
- record: 使用 ‘=’ 符號時,只查詢一行記錄的時候。
- Gap: 記錄不存在的時候退化為這個,相同間隙鎖不沖突, 查詢id>20 其實也有可能鎖住11 ,因為整個間隙都加鎖
- Next key: Gap + record
支持外健.
使用next-key locking的策略來避免幻讀
通過多版本并發(fā)控制(MVCC)獲得高并發(fā)性,并實現(xiàn)了4種隔離級別,默認REPEATABLE.
-
插入緩沖(insert buffer)
- 插入緩沖,并不是緩存的一部分,而是物理頁,對于非聚集索引的插入或更新操作,不是每一次直接插入索引頁.而是先判斷插入的非聚集索引頁是否在緩沖池中.如果在,則直接插入,如果不再,則先放入一個插入緩沖區(qū)中.然后再以一定的頻率執(zhí)行插入緩沖和非聚集索引頁子節(jié)點的合并操作
-
二次寫(double write)
- InnoDB 的Page Size一般是16KB,其數(shù)據(jù)校驗也是針對這16KB來計算的,將數(shù)據(jù)寫入到磁盤是以Page為單位進行操作的。而計算機硬件和操作系統(tǒng),在極端情況下(比如斷電)往往并不能保證這一操作的原子性,16K的數(shù)據(jù),寫入4K 時,發(fā)生了系統(tǒng)斷電/os crash ,只有一部分寫是成功的,這種情況下就是 partial page write 問題.
- 所以簡單的說就是,在將數(shù)據(jù)寫盤的時候斷電了,一部分數(shù)據(jù)丟失后,根本不能從redo log來進行恢復(fù)了。其原理是在寫數(shù)據(jù)頁之前,先把這個數(shù)據(jù)頁寫到一塊獨立的物理文件位置(ibdata),然后再寫到數(shù)據(jù)頁。在宕機重啟后,先通過該副本還原數(shù)據(jù)頁,在使用redo log.
-
自適應(yīng)哈希索引
- nnoDB采用自適用哈希索引技術(shù),它會實時監(jiān)控表上索引的使用情況,如果認為建立哈希索引可以提高查詢效率,則自動在內(nèi)存中的“自適應(yīng)哈希索引緩沖區(qū)建立哈希索引
-
預(yù)讀
- 分為線性預(yù)讀和隨機預(yù)讀
存儲其采用了聚集的方式,因此數(shù)據(jù)都是順序存儲,如沒有顯示的指定主鍵,會為每一行數(shù)據(jù)生成一個6字節(jié)的ROWID作為主鍵
2、MyISAM
不支持事物,表鎖設(shè)計,支持全文檢索,主要面向OLAP
緩沖池之緩存索引文件不緩沖數(shù)據(jù)
表由MYD 和MYI 組成,MYD存儲數(shù)據(jù),MYI 存儲索引文件
3、NDB
集群存儲引擎類似Oracle的RAC集群
數(shù)據(jù)全部存放在內(nèi)存中
(JOIN)連接操作是在mysql數(shù)據(jù)庫層完成的,而不是存儲引擎層完成。(復(fù)雜的連接操作需要巨大的網(wǎng)絡(luò)開銷,因此查詢巨慢)
4、Memory
表中數(shù)據(jù)存放在內(nèi)存中,重啟數(shù)據(jù)消失
適用于臨時數(shù)據(jù)的臨時表,數(shù)據(jù)倉庫維度表。
默認是哈希索引,而不是B+樹索引
只支持表鎖,并發(fā)性能差,并不支持TEXT和BLOB類型。
存儲變長字段(varchart)時,是按照定長字段(char)方式進行,因此會浪費內(nèi)存
如果MYSQL數(shù)據(jù)庫使用MEMORY存儲引擎作為臨時表來存放查詢的中間結(jié)果集。如果結(jié)果集大于Memory存儲引擎設(shè)置的容量,又或者其中包含TEXT 和BLOB 數(shù)據(jù)類型字段,則MySQL數(shù)據(jù)庫會把其轉(zhuǎn)換到MYISAM存儲引擎表而存放到磁盤中。因M有ISAM不緩存數(shù)據(jù)文件,所以臨時表的查詢會損失性能。
先整體回顧了下大概的結(jié)構(gòu)和知識點,下周主要針對InnoDB 做一個完整性的細節(jié)回顧
