1,引言
1.1
區(qū)分?jǐn)?shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)實(shí)例
數(shù)據(jù)庫(kù)是文件的集合,是數(shù)據(jù)集合,而數(shù)據(jù)庫(kù)實(shí)例是管理軟件,我們操作數(shù)據(jù)庫(kù),即進(jìn)行增刪改查都是通過(guò)數(shù)據(jù)庫(kù)實(shí)例進(jìn)行的
1.2 mysql的存儲(chǔ)引擎
mysql的核心就是存儲(chǔ)引擎
存儲(chǔ)引擎分為官方存儲(chǔ)引擎和第三方存儲(chǔ)引擎.有的第三方存儲(chǔ)引擎非常強(qiáng)大,入Innodb
1.2.1 Innodb
Innodb支持事務(wù),設(shè)計(jì)目標(biāo)就是在線事務(wù)處理(OLTP).行鎖設(shè)計(jì),支持外鍵,從5.5.8開(kāi)始Innodb就是默認(rèn)的存儲(chǔ)引擎,將數(shù)據(jù)放在一個(gè)邏輯的表空間中.
Innodb使用多版本并發(fā)控制(MVCC)來(lái)獲取高并發(fā)性,并實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)的四種隔離級(jí)別,默認(rèn)是REPEATABLE.同時(shí)使用一種next-key-Locking來(lái)避免幻讀現(xiàn)象的產(chǎn)生,還有許多高級(jí)特性,稍后介紹
1.2.2 MyISAM
不支持事務(wù),表鎖設(shè)計(jì),支持全文檢索,面向OLAP數(shù)據(jù)庫(kù)應(yīng)用
2 Innodb概述
第一個(gè)完整的支持ACID的存儲(chǔ)引擎,MVCC,行鎖設(shè)計(jì),支持外鍵,提供一致性非鎖定讀
2.1 Innodb的體系結(jié)構(gòu)
Innodb由多個(gè)內(nèi)存塊組成,這多個(gè)內(nèi)存塊可看做是一個(gè)內(nèi)存池

2.1.1后臺(tái)進(jìn)程
(1),Master Thread
負(fù)責(zé)內(nèi)存池的數(shù)據(jù)異步刷新到磁盤(pán),保證數(shù)據(jù)的一致性
(2),IO Thread
存儲(chǔ)引擎中使用了大量的AIO來(lái)處理IO請(qǐng)求,可以極大的提高數(shù)據(jù)庫(kù)的性能.
show variables like 'innodb_%io_threads';
查看讀寫(xiě)線程,各4個(gè)(讀/寫(xiě))
(3),Purge Thread
加快undo頁(yè)的回收,原本是Master Thread實(shí)現(xiàn)的功能,后來(lái)單另出來(lái),分擔(dān)壓力
show variables like 'innodb_purge_threads'
四個(gè)purge Thread
2.1.2內(nèi)存
(1),緩沖池
Innodb的數(shù)據(jù)都是存在磁盤(pán)上的,以頁(yè)的方式,所以是基于磁盤(pán)的數(shù)據(jù)庫(kù)系統(tǒng),但是由于CPU(處理器)和磁盤(pán)速度的鴻溝,Innodb會(huì)通過(guò)緩沖池進(jìn)行提供性能
注意:當(dāng)在緩沖池中修改頁(yè)的時(shí)候,并不是已修改就要寫(xiě)回磁盤(pán),而是通過(guò)CheckPoint的技術(shù)來(lái)提高性能
緩沖池中數(shù)據(jù)頁(yè)類(lèi)型如下圖所示:

在后來(lái)的版本中,允許有多個(gè)緩沖池的實(shí)例,每一個(gè)頁(yè)根據(jù)哈希值分配到不同的緩沖池中
同時(shí)也可以查看表的信息
use information_schema;
select pool_id,pool_size,free_buffers,database_pages from innodb_buffer_pool_stats;
(1.2)緩沖池的管理方式
LRU list(最近最少使用),頻繁使用的放在前面,不經(jīng)常使用的放在后面,當(dāng)不能存放新讀取到的頁(yè)時(shí),會(huì)首先釋放尾端的頁(yè),同時(shí)Innodb對(duì)傳統(tǒng)的URL算法進(jìn)行了優(yōu)化,在Innodb中加入了midpoint位置,當(dāng)你讀到一個(gè)新的頁(yè),不會(huì)放入到隊(duì)列的最開(kāi)頭,而是將其放在LRU list的midpoint位置
mysql> show variables like 'innodb_old_blocks_pct';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_old_blocks_pct | 37 |
+-----------------------+-------+
1 row in set (0.01 sec)
midpoint的位置大概就是37的位置(距離尾端3/8)的位置,以這個(gè)midpoint為分界點(diǎn),之前的為熱點(diǎn)區(qū),之后的為老區(qū),時(shí)刻有可能被劃分出去
至于為什么不采用傳統(tǒng)的URL算法,是因?yàn)槿绻钚碌捻?yè)直接放到首部,那么某些SQL操作可能就會(huì)是緩沖池的頁(yè)被刷出.
具體舉個(gè)例子來(lái)說(shuō):掃描操作,將大量的頁(yè)放入隊(duì)列,有可能使得原來(lái)熱點(diǎn)區(qū)的頁(yè)從LRU的列表中移除
現(xiàn)在介紹了URL list,然后我們介紹Free list.URL用來(lái)存儲(chǔ)已經(jīng)讀的頁(yè),頁(yè)都放在內(nèi)存的Free list 中.
將old區(qū)的頁(yè)到了new區(qū)的頁(yè)的過(guò)程稱(chēng)為page made young,而由于Innodb_block_time(現(xiàn)在放在了mid區(qū)域,經(jīng)過(guò)多久才能放在new區(qū))沒(méi)有放入new區(qū)等待的過(guò)程page not made young.
Innodb現(xiàn)在也支持壓縮頁(yè)的功能,原本的頁(yè)需要16kb現(xiàn)在壓縮到了1kb,2kb,4kb,8kb,這個(gè)時(shí)候?qū)τ诜?6kb的頁(yè)進(jìn)行管理的時(shí)候,通過(guò)unzip_LRU列表進(jìn)行管理.兄弟算法
Flush list存放臟頁(yè)(在LRU隊(duì)列中被修改的列,造成了緩存和磁盤(pán)數(shù)據(jù)不一致),這里要使用checkpoint方式將臟頁(yè)寫(xiě)回到磁盤(pán).
Checkpoint技術(shù)
當(dāng)對(duì)緩沖池中執(zhí)行一條DML語(yǔ)句,是的緩沖池的內(nèi)容比磁盤(pán)的新,這個(gè)時(shí)候緩沖池的頁(yè)被稱(chēng)為"臟頁(yè)",然后這個(gè)時(shí)候需要講緩沖池的內(nèi)容寫(xiě)回到磁盤(pán)中.
Checkpoint技術(shù)
縮短數(shù)據(jù)庫(kù)中的恢復(fù)時(shí)間
緩沖池不夠用的時(shí)候,將臟頁(yè)寫(xiě)回到磁盤(pán)
重做日志不可用的時(shí)候,刷新臟頁(yè).
Sharp Checkpoint在數(shù)據(jù)關(guān)閉時(shí)將臟頁(yè)全部寫(xiě)回到磁盤(pán)
Fuzzy Checkpoint,在運(yùn)行時(shí),只刷新一部分臟頁(yè),而不是刷新全部的臟頁(yè)
- master Thread CheckPoint 每秒或者每十秒將臟頁(yè)列表刷新回到磁盤(pán)中去,異步.
- FLUSH_LRU_LIST Checkpoint 需要保證的LRU列表中有100個(gè)空閑頁(yè)可用,在1.1x版本之前,會(huì)查看有多少空閑頁(yè),如果空閑頁(yè)不夠就會(huì)把LRU的尾端的頁(yè)移除,如果這些頁(yè)中有臟頁(yè)就寫(xiě)回磁盤(pán),從1.2x開(kāi)始,就是單獨(dú)的線程不會(huì)阻塞運(yùn)行,
- Async/Sync Flush Checkpoint 指的是重做日志不可用的情況下,強(qiáng)制將一些頁(yè)刷新回磁盤(pán).
- Dirty Page too much 臟頁(yè)太多的話(huà),就會(huì)寫(xiě)一部分到磁盤(pán)
master Thread
Master Thread 其中包括多個(gè)線程,Loop為主循環(huán),分為每一秒的操作和每十秒的操作.
每一秒的操作包括:
日志緩沖刷新到磁盤(pán),即使事務(wù)還沒(méi)有提交.
合并插入緩沖
刷新臟頁(yè)到磁盤(pán)中
如果沒(méi)有活動(dòng),就切換到background loop
每十秒的操作包括: