溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么理解MySQL InnoDB的存儲(chǔ)結(jié)構(gòu)

發(fā)布時(shí)間:2021-11-16 15:36:20 來(lái)源:億速云 閱讀:170 作者:柒染 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章將為大家詳細(xì)講解有關(guān)怎么理解MySQL InnoDB的存儲(chǔ)結(jié)構(gòu),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

從物理意義上來(lái)講,InnoDB表由共享表空間、日志文件組(redo文件組)、表結(jié)構(gòu)定義文件組成。若將innodb_file_per_table設(shè)置為on,則系統(tǒng)將為每一個(gè)表單獨(dú)的生成一個(gè)table_name.ibd的文件,
在此文件中,存儲(chǔ)與該表相關(guān)的數(shù)據(jù)、索引、表的內(nèi)部數(shù)據(jù)字典信息。表結(jié)構(gòu)文件則以.frm結(jié)尾,這與存儲(chǔ)引擎無(wú)關(guān)。


  以下為InnoDB的表空間結(jié)構(gòu)圖:

怎么理解MySQL InnoDB的存儲(chǔ)結(jié)構(gòu)

在InnoDB存儲(chǔ)引擎中,默認(rèn)表空間文件是ibdata1,初始化為10M,且可以擴(kuò)展,如下圖所示:
怎么理解MySQL InnoDB的存儲(chǔ)結(jié)構(gòu)
實(shí)際上,InnoDB的表空間文件是可以修改的,使用以下語(yǔ)句就可以修改:

Innodb_data_file_path=ibdata1:370M;ibdata2:50M:autoextend


  使用共享表空間存儲(chǔ)方式時(shí),Innodb的所有數(shù)據(jù)保存在一個(gè)單獨(dú)的表空間里面,而這個(gè)表空間可以由很多個(gè)文件組成,一個(gè)表可以跨多個(gè)文件存在,所以其大小限制不再是文件大小的限制,
而是其自身的限制。從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說(shuō),Innodb的單表限制基本上也在64TB左右了,當(dāng)然這個(gè)大小是包括這個(gè)表的所有索引等其他相關(guān)數(shù)據(jù)。

  而在使用單獨(dú)表空間存儲(chǔ)方式時(shí),每個(gè)表的數(shù)據(jù)以一個(gè)單獨(dú)的文件來(lái)存放,這個(gè)時(shí)候的單表限制,又變成文件系統(tǒng)的大小限制了。

  以下即為不同平臺(tái)下,單獨(dú)表空間文件最大限度。

Operating System  File-size Limit
Win32 w/ FAT/FAT32  2GB/4GB
Win32 w/ NTFS          2TB (possibly larger)
Linux 2.4+          (using ext3 file system) 4TB
Solaris 9/10          16TB
MacOS X w/ HFS+         2TB
NetWare w/NSS file system  8TB


※ 以下是MySQL文檔中的內(nèi)容:
Windows用戶請(qǐng)注意: FAT和VFAT (FAT32)不適合MySQL的生產(chǎn)使用。應(yīng)使用NTFS。


共享表空間與獨(dú)占表空間可以通過(guò)參數(shù)innodb_file_per_table來(lái)轉(zhuǎn)換,若為1,則開(kāi)啟獨(dú)占表空間,否則,開(kāi)啟共享表存儲(chǔ)。


服務(wù)器資源有限,單表數(shù)據(jù)不是特別多的情況下, 獨(dú)立表空間明顯比共享方式效率更高 . 但是MySQL 默認(rèn)是共享表空間 。


具體的共享表空間和獨(dú)立表空間優(yōu)缺點(diǎn)如下:


共享表空間:
優(yōu)點(diǎn):
可以放表空間分成多個(gè)文件存放到各個(gè)磁盤(pán)上(表空間文件大小不受表大小的限制,如一個(gè)表可以分布在不同步的文件上)。數(shù)據(jù)和文件放在一起方便管理。
缺點(diǎn):
所有的數(shù)據(jù)和索引存放到一個(gè)文件中以為著將有一個(gè)很常大的文件,雖然可以把一個(gè)大文件分成多個(gè)小文件,但是多個(gè)表及索引在表空間中混合存儲(chǔ),這樣對(duì)于一個(gè)表做了大量刪除操作后表空間中將會(huì)
有大量的空隙,特別是對(duì)于統(tǒng)計(jì)分析,日值系統(tǒng)這類應(yīng)用最不適合用共享表空間。


獨(dú)立表空間:在配置文件(my.cnf)中設(shè)置: innodb_file_per_table


優(yōu)點(diǎn):
1.  每個(gè)表都有自已獨(dú)立的表空間。
2.  每個(gè)表的數(shù)據(jù)和索引都會(huì)存在自已的表空間中。
3.  可以實(shí)現(xiàn)單表在不同的數(shù)據(jù)庫(kù)中移動(dòng)。
4.  空間可以回收(除drop table操作處,表空不能自已回收)
a)         Drop table操作自動(dòng)回收表空間,如果對(duì)于統(tǒng)計(jì)分析或是日值表,刪除大量數(shù)據(jù)后可以通過(guò):alter table TableName engine=innodb;回縮不用的空間。
b)         對(duì)于使innodb-plugin的Innodb使用truncate table也會(huì)使空間收縮。
c)         對(duì)于使用獨(dú)立表空間的表,不管怎么刪除,表空間的碎片不會(huì)太嚴(yán)重的影響性能,而且還有機(jī)會(huì)處理。
缺點(diǎn):
單表增加過(guò)大,如超過(guò)100個(gè)G。


※ 對(duì)于啟用了innodb_file_per_table 的參數(shù)選項(xiàng)之后,在每個(gè)表對(duì)應(yīng)的.idb文件內(nèi)只是存放了數(shù)據(jù)、索引和插入緩沖,而撤銷(undo)信息,系統(tǒng)事務(wù)信息,二次寫(xiě)緩沖等還是存放在了原來(lái)的共享表空間內(nèi)。


※ 數(shù)據(jù)段即B+樹(shù)的葉節(jié)點(diǎn),索引段即為B+樹(shù)的非索引節(jié)點(diǎn)。


※ InnoDB存儲(chǔ)引擎的管理是由引擎本身完成的,表空間是由分散的頁(yè)和段組成。


※ 區(qū)由64個(gè)連續(xù)的頁(yè)組成,每個(gè)頁(yè)大小為16K,即每個(gè)區(qū)大小為1MB,創(chuàng)建新表時(shí),先有32頁(yè)大小的碎片頁(yè)存放數(shù)據(jù),使用完后才是區(qū)的申請(qǐng),(InnoDB最多每次申請(qǐng)4個(gè)區(qū),保證數(shù)據(jù)的順序性能)

※ 頁(yè)類型有:數(shù)據(jù)頁(yè)、Undo頁(yè)、系統(tǒng)頁(yè)、事務(wù)數(shù)據(jù)頁(yè)、插入緩沖位圖頁(yè)、以及插入緩沖空閑列表頁(yè)。

關(guān)于怎么理解MySQL InnoDB的存儲(chǔ)結(jié)構(gòu)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI