白城網(wǎng)站建設(shè)seo技術(shù)培訓(xùn)江門
一、邏輯存儲(chǔ)結(jié)構(gòu)
表空間:ibd文件,一個(gè)MySQL實(shí)例可以對(duì)應(yīng)多個(gè)表空間,用于存儲(chǔ)記錄,索引等數(shù)據(jù);
段:分為數(shù)據(jù)段(leaf node segment)、索引段(non-leaf node segment)、回滾段(rollback segment),innodb是索引組織表,數(shù)據(jù)段就是B+樹的非葉子節(jié)點(diǎn)。段用來(lái)管理多個(gè)extent(區(qū));
區(qū):表空間的單元結(jié)構(gòu),每個(gè)區(qū)的大小都為1M,默認(rèn)情況下,innoDB存儲(chǔ)引擎頁(yè)大小為16k,即一個(gè)區(qū)中一共有64個(gè)連續(xù)頁(yè);
頁(yè):是innodb存儲(chǔ)引擎磁盤管理的最小單元,每個(gè)頁(yè)的大小默認(rèn)為16kb,為了保證頁(yè)的連續(xù)性,innodb存儲(chǔ)引擎每次從磁盤申請(qǐng)4-5個(gè)區(qū);
行:innodb存儲(chǔ)引擎數(shù)據(jù)是按行進(jìn)行存放的;
trx_id:每次對(duì)某條記錄進(jìn)行改動(dòng)時(shí),都會(huì)把對(duì)應(yīng)的事務(wù)id賦值給trx_id隱藏列;
rool_pointer:每次對(duì)某條記錄進(jìn)行改動(dòng)時(shí),都會(huì)把舊的版本寫入到undo日志中,然后這個(gè)隱藏列就相當(dāng)于一個(gè)指針,可以通過它來(lái)找到該記錄修改前的信息;
二、架構(gòu)
1.內(nèi)存架構(gòu)
(1)緩沖池
buffer pool:緩沖池是主內(nèi)存中的一個(gè)區(qū)域,里面可以緩存磁盤上經(jīng)常操作的真實(shí)數(shù)據(jù),在執(zhí)行增刪改查操作時(shí),先操作緩沖池中的數(shù)據(jù)(若緩沖池沒有數(shù)據(jù),則從磁盤加載并緩存),然后再以一定的頻率刷新到磁盤,從而減少磁盤io,加快處理速度。
緩沖池以page頁(yè)為單位,底層采用鏈表數(shù)據(jù)管理page。根據(jù)狀態(tài),將page分為三種類型:
free page:空閑page,未被使用;
clean page:被使用page,數(shù)據(jù)沒有被修改過;
dirty page:臟頁(yè),被使用page,數(shù)據(jù)被修改過,頁(yè)中數(shù)據(jù)與磁盤的數(shù)據(jù)產(chǎn)生了不一致;
緩沖池包含:更改緩沖區(qū)、自適應(yīng)hash索引
(2)更改緩沖區(qū)(change buffer)
針對(duì)于非唯一二級(jí)索引頁(yè),在執(zhí)行DML語(yǔ)句時(shí),如果這些數(shù)據(jù)page沒有在buffer pool中,不會(huì)直接操作磁盤,而會(huì)將數(shù)據(jù)變更存在更改緩沖區(qū) change buffer中,在未來(lái)數(shù)據(jù)被讀取時(shí),再將數(shù)據(jù)合并并恢復(fù)到buffer pool中,再將合并后的數(shù)據(jù)刷新到磁盤中。
存在的意義:與聚集索引不同,二級(jí)索引通常是非唯一的,