MySQL—MySQL的存儲(chǔ)引擎之InnoDB
存儲(chǔ)引擎及種類
存儲(chǔ)引擎 | 說(shuō)明 |
---|---|
MyISAM | 高速引擎,擁有較高的插入,查詢速度,但不支持事務(wù) |
InnoDB | 5.5版本后MySQL的默認(rèn)數(shù)據(jù)庫(kù)存儲(chǔ)引擎,支持事務(wù)和行級(jí)鎖,比MyISAM處理速度稍慢 |
ISAM | MyISAM的前身,MySQL5.0以后不再默認(rèn)安裝 |
MRG_MyISAM | 將多個(gè)表聯(lián)合成一個(gè)表使用,在超大規(guī)模數(shù)據(jù)存儲(chǔ)時(shí)很有用 |
Memory | 內(nèi)存存儲(chǔ)引擎,擁有極高的插入,更新和查詢效率。但是會(huì)占用和數(shù)據(jù)量成正比的內(nèi)存空間。只在內(nèi)存上保存數(shù)據(jù),意味著數(shù)據(jù)可能會(huì)丟失 |
Archive | 將數(shù)據(jù)壓縮后進(jìn)行存儲(chǔ),非常適合存儲(chǔ)大量的獨(dú)立的,作為歷史記錄的數(shù)據(jù),但是只能進(jìn)行插入和查詢操作 |
CSV | CSV 存儲(chǔ)引擎是基于 CSV 格式文件存儲(chǔ)數(shù)據(jù)(應(yīng)用于跨平臺(tái)的數(shù)據(jù)交換) |
怎么選擇存儲(chǔ)引擎?:
除非需要用到某些InnoDB不具備的特性,并且沒有其他辦法可以替代,否則都應(yīng)該選擇InnoDB引擎。(大部分情況下都選擇InnoDB。)
InnonDB和MyISAM的比較
比較項(xiàng) | InnonDB | MyISAM |
---|---|---|
存儲(chǔ)文件 | .frm是表定義文件 .ibd是數(shù)據(jù)文件和索引文件 |
.frm是表定義文件 .myd數(shù)據(jù)文件 .myi是索引文件 |
鎖 | 支持表鎖、行鎖 | 支持表鎖 |
是否支持外鍵 | 支持外鍵 | 不支持外鍵 |
是否支持事務(wù) | 支持 | 不支持 |
CRUD | 讀、寫 | 讀多 |
索引結(jié)構(gòu) | B+Tree | B+Tree |
show engines;
InnonDB架構(gòu)
InnonDB架構(gòu)圖如下:
從圖中可見,InnoDB存儲(chǔ)引擎由內(nèi)存結(jié)構(gòu)、磁盤結(jié)構(gòu)兩部分組成。
內(nèi)存結(jié)構(gòu)
lnnoDB內(nèi)存結(jié)構(gòu)主要分為如下四個(gè)區(qū)域:
- Buffer Pool緩沖池
- Change Buffer修改緩沖
- Adaptive Hash lndex自適應(yīng)索引
- Log Buffer日志緩沖
緩沖池(Buffer Pool)
緩沖池Buaffer Pool用于加速數(shù)據(jù)的訪問(wèn)和修改,通過(guò)將熱點(diǎn)數(shù)據(jù)緩存在內(nèi)存的方法最大限度地減少磁盤IO,加速熱點(diǎn)數(shù)據(jù)讀寫。
- 默認(rèn)大小為128M,Buffer Pool中數(shù)據(jù)以頁(yè)為存儲(chǔ)單位,其實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)是以頁(yè)為單位的單鏈表。
- 由于內(nèi)存的空間限制,Buffer Pool僅能容納最熱點(diǎn)的數(shù)據(jù)。
- Buffer Pool使用LRU算法 (Least Recently Used最近最少使用)淘汰非熱點(diǎn)數(shù)據(jù)頁(yè)。
- LRU:根據(jù)頁(yè)數(shù)據(jù)的歷史訪問(wèn)來(lái)淘汰數(shù)據(jù),如果數(shù)據(jù)最近被訪問(wèn)過(guò),那么將來(lái)被訪問(wèn)的幾率也更高,優(yōu)先淘汰最近沒有被訪問(wèn)到的數(shù)據(jù)。
- 對(duì)于Buffer Pool中數(shù)據(jù)的查詢,InnoDB直接讀取返回。對(duì)于Buffer Pool中數(shù)據(jù)的修改,lnnoDB直接在Buffer Pool中修改,并將修改寫入redo log。
修改緩沖(Change Buffer)
用于加速非熱點(diǎn)數(shù)據(jù)中二級(jí)索引的寫入操作。
修改緩沖對(duì)二級(jí)索引的修改操作會(huì)錄入redo log中。
在緩沖到一定量或系統(tǒng)較空閑時(shí)進(jìn)行merge操作(寫入磁盤) ;
其物理結(jié)構(gòu)為一棵名為ibuf的B+樹。
自適應(yīng)哈希索引(Adaptive Hash Index)
用于實(shí)現(xiàn)對(duì)于熱數(shù)據(jù)頁(yè)的一次查詢,是建立在索引之上的索引。
作用:對(duì)頻繁查詢的數(shù)據(jù)頁(yè)和索引頁(yè)進(jìn)一步提速
AHI大小為Buffer Pool的1/64
對(duì)于二級(jí)索引,若命中 AHI,則將直接從 AHI 獲取二級(jí)索引頁(yè)的記錄指針,再根據(jù)主鍵沿著聚簇索引查找數(shù)據(jù);若聚簇索引查詢同樣命中 AHI,則直接返回目標(biāo)數(shù)據(jù)頁(yè)的記錄指針,此時(shí)就可以根據(jù)記錄指針直接定位數(shù)據(jù)頁(yè)。
日志緩沖(Log Buffer)
InnoDB使用Log Buffer 來(lái)緩沖日志文件的寫入操作。內(nèi)存寫入加上日志文件順序?qū)懙奶攸c(diǎn),使得InnoDB日志寫入性能極高。
這種將分散操作改為批量操作的優(yōu)化方式將增加數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
磁盤文件之表空間
在磁盤中,InnoDB將所有數(shù)據(jù)都邏輯地存放在一個(gè)空間中,稱為表空間(Tablespace)。表空間由段(Segment) 、區(qū)(extent) 、頁(yè)(Page)組成。
- 開啟獨(dú)立表空間
innodb_file_per_table=1
,每張表的數(shù)據(jù)都會(huì)存儲(chǔ)到一個(gè)獨(dú)立表空間,即表名.ibd
文件 - 關(guān)閉獨(dú)占表空間
innodb_file_per_table=0
,則所有基于InnoDB存儲(chǔ)引擎的表數(shù)據(jù)都會(huì)記錄到系統(tǒng)表空間,即ibdata1
文件
表空間是 InnoDB 物理存儲(chǔ)中的最高層,目前的表空間類別包括:
- 系統(tǒng)表空間(System Tablespace)
- 獨(dú)立表空間(File-per-table Tablespace)
- 通用表空間(General Tablespace)
- 回滾表空間(Undo Tablespace)
- 臨時(shí)表空間(The Temporary Tablespace)
磁盤文件之存儲(chǔ)結(jié)構(gòu)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-859266.html
內(nèi)存數(shù)據(jù)落盤
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859266.html
到了這里,關(guān)于MySQL—MySQL的存儲(chǔ)引擎之InnoDB的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!