InnoDB內(nèi)存緩存區(qū),使用空間換時(shí)間的思想,給數(shù)據(jù)做了一個(gè)緩存。把熱點(diǎn)的數(shù)據(jù)存儲(chǔ)在內(nèi)存中,減少IO次數(shù),提高效率。
show variables like '%innodb_buffer_pool%';
LRU算法buffer pool 滿了,使用LRU算法淘汰數(shù)據(jù),剩下的就是熱點(diǎn)數(shù)據(jù)
buffer pool內(nèi)存回收算法,不同于傳統(tǒng)的LRU算法,分為熱區(qū)、冷區(qū)。加載數(shù)據(jù)先到冷區(qū),默認(rèn)1s后,在此被使用到,加入到熱區(qū)。
2.1.2、Change Buffer 寫緩沖Change Buffer是Buffer Pool的一部分,如果這個(gè)數(shù)據(jù)頁(yè)不是唯一索引
,不存在數(shù)據(jù)重復(fù)的情況,那就不需要從磁盤讀取數(shù)據(jù)校驗(yàn)唯一性。這種情況可以先修改內(nèi)存中緩沖池中的數(shù)據(jù)記錄,從而提高insert、update、delete的效率。5.5版本之前inset buffer,現(xiàn)在也可以處理update、delete操作,所以這塊區(qū)域 叫做Chang Buffer。
最后將Change Buffer數(shù)據(jù)記錄到磁盤的操作叫做merge
什么時(shí)候進(jìn)行merge操作呢?
調(diào)整change buffer
大小,這里只能調(diào)整它占用buffer pool
的比例,通過(guò)下面的參數(shù)調(diào)整
show variables like '%innodb_change_buffer_max_size%'; # 默認(rèn)25%
2.1.3、Adaptive Hash Index(自適應(yīng)索引)
2.1.4、Redo Log Bufferredo log 不是每一次都寫入磁盤,在buffer pool中專門留出一個(gè)區(qū)域(log buffer)用于緩存,即將要寫入日志文件的數(shù)據(jù),默認(rèn)16M。
下面參數(shù)控制log buffer寫入磁盤的時(shí)機(jī):
show variables like '%innodb_flush_log_at_trx_commit%'; # 默認(rèn)值是1
值 | 含義 |
---|---|
0 (延遲寫) | log buffer每秒寫一次log file,并且log file的flush操作同時(shí)進(jìn)行。該種事務(wù)下,事務(wù)提交的時(shí)候,不會(huì)主動(dòng)觸發(fā)寫入磁盤的操作。 |
1 (默認(rèn),實(shí)時(shí)寫,實(shí)時(shí)刷) | 每次事務(wù)提交時(shí),都會(huì)把log buffer的數(shù)據(jù)寫入log file,并且刷到磁盤中。 |
2 (實(shí)時(shí)寫,延遲刷) | 每次事務(wù)提交mysql都會(huì)把log buffer的數(shù)據(jù)寫入log file。但是flush操作并不會(huì)同時(shí)進(jìn)行。該模式下,mysql會(huì)每秒執(zhí)行一次flush操作。 |
刷盤越快,越安全,但是也會(huì)消耗性能。
2.2、磁盤結(jié)構(gòu) 2.2.1、系統(tǒng)表空間 System tablespaces在默認(rèn)情況下InnoDB存儲(chǔ)引擎有一個(gè)共享表空間(對(duì)應(yīng)文件/var/lib/mysql/ibdata1),也叫系統(tǒng)表空間。
InnoDB系統(tǒng)表空間包含InnoBD數(shù)據(jù)字典
和雙寫緩沖區(qū),Change Buffer 和Undo Logs,如果沒(méi)有指定file-per-table,也包含用戶創(chuàng)建的表和索引數(shù)據(jù)。
InnoBD的頁(yè)和操作系統(tǒng)的頁(yè)大小不一致,InnoDB頁(yè)大小一般為16K,操作系統(tǒng)的頁(yè)大小為4K,InnoDB的頁(yè)寫入到磁盤時(shí),需要分4次寫入。如果在這個(gè)4次寫磁盤的過(guò)程中,出現(xiàn)宕機(jī)。這種情況叫做部分寫失效,可能導(dǎo)致數(shù)據(jù)丟失。
開關(guān)參數(shù)
show variables like 'innodb_doublewrite';
雖然我們可以通過(guò)redo log進(jìn)行數(shù)據(jù)恢復(fù),但是在這個(gè)過(guò)程中,如果數(shù)據(jù)頁(yè)損壞了,就不能用來(lái)恢復(fù)數(shù)據(jù)了。所以在InnoDB數(shù)據(jù)頁(yè)進(jìn)行寫入磁盤的時(shí)候,留下一個(gè)數(shù)據(jù)頁(yè)副本,保證可以正常使用redo log恢復(fù)數(shù)據(jù),這就double write
,InnoDB的雙寫技術(shù)。
double write
由兩部分組成,一部分內(nèi)存中double write,一部分是磁盤上double write。因?yàn)閐ouble write是順序?qū)懭氲?,不?huì)帶來(lái)很大的開銷。
可以通過(guò)下面開關(guān)設(shè)置,每個(gè)表獨(dú)占一個(gè)表空間。
show variables like 'innodb_file_per_table'; # 默認(rèn)開啟
開啟后,每張表都會(huì)開辟一個(gè)表空間,這個(gè)文件就是數(shù)據(jù)目錄下ibd文件,存放表的數(shù)據(jù)和索引。
2.2.3、通用表空間 general tablespaces 2.2.4、臨時(shí)表空間 temporary tablespaces 2.2.5、undo表空間 undo log tablespaces 2.3、后臺(tái)線程change buffer
、log
、read
、write
進(jìn)程。分別用來(lái)處理change buffer、重做日志、讀寫請(qǐng)求的IO回調(diào)。你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧