感覺好久沒有看MySQL相關(guān)的書了,最近邊復(fù)習(xí)陷遮,邊整理下感覺重要的知識(shí)點(diǎn)滓走,一點(diǎn)點(diǎn)的由簡(jiǎn)入繁,先從整體概念上理解下帽馋,擴(kuò)充下整個(gè)知識(shí)圖譜搅方。
一比吭、MySQL 體系結(jié)構(gòu)
基礎(chǔ)中有兩個(gè)重要概念,數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)實(shí)例姨涡。
數(shù)據(jù)庫(kù):文件的集合衩藤,依照某種數(shù)據(jù)模型組織并存放于二級(jí)存儲(chǔ)器中的數(shù)據(jù)集合。
數(shù)據(jù)庫(kù)實(shí)例:是程序涛漂,位于用戶與操作系統(tǒng)之間的一層數(shù)據(jù)庫(kù)管理軟件赏表,用戶對(duì)于數(shù)據(jù)庫(kù)的任何操作(DML,DDL)都是在數(shù)據(jù)庫(kù)實(shí)例下進(jìn)行的匈仗,應(yīng)用程序只有通過數(shù)據(jù)庫(kù)實(shí)例才能和數(shù)據(jù)庫(kù)打交道瓢剿。
看了,最開始的架構(gòu)圖悠轩,可以了解到MySQL 由以下組成
1间狂、連接池組件
2、管理和工具組件
3火架、接口組件
4鉴象、解析器組件
5、優(yōu)化器組件
6何鸡、緩存組件
7纺弊、插件式的存儲(chǔ)引擎
8、物理文件
注意:存儲(chǔ)引擎是基于表音比,而不是數(shù)據(jù)庫(kù)
二俭尖、存儲(chǔ)引擎
下面介紹幾個(gè)重要的存儲(chǔ)引擎的特點(diǎn)
1、InnoDB
特點(diǎn):
支持事物洞翩,主要面向在線數(shù)據(jù)處理OLTP
-
支持行鎖設(shè)計(jì)
- 分為共享鎖和排它鎖
- 行鎖有基本的三種算法
- record: 使用 ‘=’ 符號(hào)時(shí)稽犁,只查詢一行記錄的時(shí)候。
- Gap: 記錄不存在的時(shí)候退化為這個(gè)骚亿,相同間隙鎖不沖突已亥, 查詢id>20 其實(shí)也有可能鎖住11 ,因?yàn)檎麄€(gè)間隙都加鎖
- Next key: Gap + record
支持外健.
使用next-key locking的策略來避免幻讀
通過多版本并發(fā)控制(MVCC)獲得高并發(fā)性来屠,并實(shí)現(xiàn)了4種隔離級(jí)別虑椎,默認(rèn)REPEATABLE.
-
插入緩沖(insert buffer)
- 插入緩沖,并不是緩存的一部分,而是物理頁(yè),對(duì)于非聚集索引的插入或更新操作,不是每一次直接插入索引頁(yè).而是先判斷插入的非聚集索引頁(yè)是否在緩沖池中.如果在,則直接插入,如果不再,則先放入一個(gè)插入緩沖區(qū)中.然后再以一定的頻率執(zhí)行插入緩沖和非聚集索引頁(yè)子節(jié)點(diǎn)的合并操作
-
二次寫(double write)
- InnoDB 的Page Size一般是16KB,其數(shù)據(jù)校驗(yàn)也是針對(duì)這16KB來計(jì)算的俱笛,將數(shù)據(jù)寫入到磁盤是以Page為單位進(jìn)行操作的捆姜。而計(jì)算機(jī)硬件和操作系統(tǒng),在極端情況下(比如斷電)往往并不能保證這一操作的原子性迎膜,16K的數(shù)據(jù)泥技,寫入4K 時(shí),發(fā)生了系統(tǒng)斷電/os crash 磕仅,只有一部分寫是成功的珊豹,這種情況下就是 partial page write 問題.
- 所以簡(jiǎn)單的說就是簸呈,在將數(shù)據(jù)寫盤的時(shí)候斷電了,一部分?jǐn)?shù)據(jù)丟失后店茶,根本不能從redo log來進(jìn)行恢復(fù)了蜕便。其原理是在寫數(shù)據(jù)頁(yè)之前,先把這個(gè)數(shù)據(jù)頁(yè)寫到一塊獨(dú)立的物理文件位置(ibdata)贩幻,然后再寫到數(shù)據(jù)頁(yè)轿腺。在宕機(jī)重啟后,先通過該副本還原數(shù)據(jù)頁(yè)丛楚,在使用redo log.
-
自適應(yīng)哈希索引
- nnoDB采用自適用哈希索引技術(shù)吃溅,它會(huì)實(shí)時(shí)監(jiān)控表上索引的使用情況,如果認(rèn)為建立哈希索引可以提高查詢效率鸯檬,則自動(dòng)在內(nèi)存中的“自適應(yīng)哈希索引緩沖區(qū)建立哈希索引
-
預(yù)讀
- 分為線性預(yù)讀和隨機(jī)預(yù)讀
存儲(chǔ)其采用了聚集的方式,因此數(shù)據(jù)都是順序存儲(chǔ)螺垢,如沒有顯示的指定主鍵喧务,會(huì)為每一行數(shù)據(jù)生成一個(gè)6字節(jié)的ROWID作為主鍵
2、MyISAM
不支持事物枉圃,表鎖設(shè)計(jì)功茴,支持全文檢索,主要面向OLAP
緩沖池之緩存索引文件不緩沖數(shù)據(jù)
表由MYD 和MYI 組成孽亲,MYD存儲(chǔ)數(shù)據(jù)坎穿,MYI 存儲(chǔ)索引文件
3、NDB
集群存儲(chǔ)引擎類似Oracle的RAC集群
數(shù)據(jù)全部存放在內(nèi)存中
(JOIN)連接操作是在mysql數(shù)據(jù)庫(kù)層完成的返劲,而不是存儲(chǔ)引擎層完成玲昧。(復(fù)雜的連接操作需要巨大的網(wǎng)絡(luò)開銷,因此查詢巨慢)
4篮绿、Memory
表中數(shù)據(jù)存放在內(nèi)存中孵延,重啟數(shù)據(jù)消失
適用于臨時(shí)數(shù)據(jù)的臨時(shí)表,數(shù)據(jù)倉(cāng)庫(kù)維度表亲配。
默認(rèn)是哈希索引尘应,而不是B+樹索引
只支持表鎖,并發(fā)性能差吼虎,并不支持TEXT和BLOB類型犬钢。
存儲(chǔ)變長(zhǎng)字段(varchart)時(shí),是按照定長(zhǎng)字段(char)方式進(jìn)行思灰,因此會(huì)浪費(fèi)內(nèi)存
如果MYSQL數(shù)據(jù)庫(kù)使用MEMORY存儲(chǔ)引擎作為臨時(shí)表來存放查詢的中間結(jié)果集玷犹。如果結(jié)果集大于Memory存儲(chǔ)引擎設(shè)置的容量,又或者其中包含TEXT 和BLOB 數(shù)據(jù)類型字段官辈,則MySQL數(shù)據(jù)庫(kù)會(huì)把其轉(zhuǎn)換到MYISAM存儲(chǔ)引擎表而存放到磁盤中箱舞。因M有ISAM不緩存數(shù)據(jù)文件遍坟,所以臨時(shí)表的查詢會(huì)損失性能。
先整體回顧了下大概的結(jié)構(gòu)和知識(shí)點(diǎn)晴股,下周主要針對(duì)InnoDB 做一個(gè)完整性的細(xì)節(jié)回顧