從物理意義上來(lái)講,InnoDB表由共享表空間文件(ibdata1)、獨(dú)占表空間文件(ibd)、表結(jié)構(gòu)文件(.frm)、以及日志文件(redo文件等)組成。
1、表結(jié)構(gòu)文件
在MYSQL中建立任何一張數(shù)據(jù)表,在其數(shù)據(jù)目錄對(duì)應(yīng)的數(shù)據(jù)庫(kù)目錄下都有對(duì)應(yīng)表的.frm文件,.frm文件是用來(lái)保存每個(gè)數(shù)據(jù)表的元數(shù)據(jù)(meta)信息,包括表結(jié)構(gòu)的定義等,.frm文件跟數(shù)據(jù)庫(kù)存儲(chǔ)引擎無(wú)關(guān),也就是任何存儲(chǔ)引擎的數(shù)據(jù)表都必須有.frm文件,命名方式為數(shù)據(jù)表名.frm,如user.frm. .frm文件可以用來(lái)在數(shù)據(jù)庫(kù)崩潰時(shí)恢復(fù)表結(jié)構(gòu)。
2、表空間文件
(1)表空間結(jié)構(gòu)分析
以下為InnoDB的表空間結(jié)構(gòu)圖:
數(shù)據(jù)段即B+樹的葉子節(jié)點(diǎn),索引段即為B+樹的非葉子節(jié)點(diǎn)InnoDB存儲(chǔ)引擎的管理是由引擎本身完成的,表空間(Tablespace)是由分散的段(Segment)組成。一個(gè)段(Segment)包含多個(gè)區(qū)(Extent)。
區(qū)(Extent)由64個(gè)連續(xù)的頁(yè)(Page)組成,每個(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è)。
(2)獨(dú)占表空間文件
若將innodb_file_per_table設(shè)置為on,則系統(tǒng)將為每一個(gè)表單獨(dú)的生成一個(gè)table_name.ibd的文件,在此文件中,存儲(chǔ)與該表相關(guān)的數(shù)據(jù)、索引、表的內(nèi)部數(shù)據(jù)字典信息。
(3)共享表空間文件
在InnoDB存儲(chǔ)引擎中,默認(rèn)表空間文件是ibdata1(主要存儲(chǔ)的是共享表空間數(shù)據(jù)),初始化為10M,且可以擴(kuò)展,如下圖所示:
實(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,也就是說,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。
(4)共享表空間與獨(dú)占表空間
共享表空間以及獨(dú)占表空間都是針對(duì)數(shù)據(jù)的存儲(chǔ)方式而言的。
共享表空間: 某一個(gè)數(shù)據(jù)庫(kù)的所有的表數(shù)據(jù),索引文件全部放在一個(gè)文件中,默認(rèn)這個(gè)共享表空間的文件路徑在data目錄下。 默認(rèn)的文件名為:ibdata1 初始化為10M。
獨(dú)占表空間: 每一個(gè)表都將會(huì)生成以獨(dú)立的文件方式來(lái)進(jìn)行存儲(chǔ)(.ibd文件,這個(gè)文件包括了單獨(dú)一個(gè)表的數(shù)據(jù)內(nèi)容以及索引內(nèi)容)。
1)存儲(chǔ)內(nèi)容比較
使用獨(dú)占表空間之后:
每個(gè)表對(duì)應(yīng)的數(shù)據(jù)、索引和插入緩沖 存放在獨(dú)占表空間(.idb文件)
每個(gè)表對(duì)應(yīng)的撤銷(undo)信息,系統(tǒng)事務(wù)信息,二次寫緩沖等還是存放在了原來(lái)的共享表空間內(nèi)(ibdata1文件)
2)特點(diǎn)比較
具體的共享表空間和獨(dú)立表空間優(yōu)缺點(diǎn)如下:
共享表空間:
優(yōu)點(diǎn):
可以放表空間分成多個(gè)文件存放到各個(gè)磁盤上(表空間文件大小不受表大小的限制,如一個(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):
- 每個(gè)表都有自已獨(dú)立的表空間。
- 每個(gè)表的數(shù)據(jù)和索引都會(huì)存在自已的表空間中。
- 可以實(shí)現(xiàn)單表在不同的數(shù)據(jù)庫(kù)中移動(dòng)。
- 空間可以回收
對(duì)于使用獨(dú)立表空間的表,不管怎么刪除,表空間的碎片不會(huì)太嚴(yán)重的影響性能,而且還有機(jī)會(huì)處理。
a)Drop table操作自動(dòng)回收表空間
b)如果對(duì)于統(tǒng)計(jì)分析或是日值表,刪除大量數(shù)據(jù)后可以通過:alter table TableName engine=innodb;回縮不用的空間。
c) 對(duì)于使innodb-plugin的Innodb使用truncate table也會(huì)使空間收縮。
5、在服務(wù)器資源有限,單表數(shù)據(jù)不是特別多的情況下, 獨(dú)立表空間明顯比共享方式效率更高 . 但是MySQL 默認(rèn)是共享表空間 。
缺點(diǎn):
單表體積可能過大,如超過100個(gè)G。
3)共享表空間以及獨(dú)占表空間之間的轉(zhuǎn)化
修改獨(dú)占空表空間配置,配置以下參數(shù)
innodb_data_home_dir = "/user/local/mysql/var" 數(shù)據(jù)庫(kù)文件所存放的目錄
innodb_log_group_home_dir = "/user/local/mysql/var" 日志存放目錄
innodb_data_file_path=ibdata1:10M:autoextend 設(shè)置配置一個(gè)可擴(kuò)展大小的尺寸為10MB的單獨(dú)文件(共享數(shù)據(jù)文件),名為ibdata1。沒有給出文件的位置,所以默認(rèn)的是在MySQL的數(shù)據(jù)目錄內(nèi)。
innodb_file_per_table=1 是否使用共享還是獨(dú)占表空間 (1:為使用獨(dú)占表空間,0:為使用共享表空間)
查看innodb_file_per_table 變量,如果為OFF說明所使用的是共享表空間(默認(rèn)情況下,所使用的表空間為共享表空間)
對(duì)innodb_file_per_table 進(jìn)行修改時(shí),對(duì)于之前使用過的共享表空間不會(huì)影響,除非手動(dòng)的去進(jìn)行修改
注意:
InnoDB不創(chuàng)建目錄,所以在啟動(dòng)服務(wù)器之前請(qǐng)確認(rèn)所配置的路徑目錄存在。
做數(shù)據(jù)的移植以及備份時(shí),要注意數(shù)據(jù)文件的完整性.
您可能感興趣的文章:- InnoDB 類型MySql恢復(fù)表結(jié)構(gòu)與數(shù)據(jù)
- MySQL啟動(dòng)時(shí)InnoDB引擎被禁用了的解決方法
- mysql執(zhí)行sql文件報(bào)錯(cuò)Error: Unknown storage engine‘InnoDB’的解決方法
- mysql innodb 異常修復(fù)經(jīng)驗(yàn)分享
- mysql innodb的監(jiān)控(系統(tǒng)層,數(shù)據(jù)庫(kù)層)
- Mysql更換MyISAM存儲(chǔ)引擎為Innodb的操作記錄總結(jié)
- 關(guān)于MySQL innodb_autoinc_lock_mode介紹
- MySQL優(yōu)化之InnoDB優(yōu)化
- MySQL存儲(chǔ)引擎中MyISAM和InnoDB區(qū)別詳解
- MySQL提示The InnoDB feature is disabled需要開啟InnoDB的解決方法
- MySQL中Innodb的事務(wù)隔離級(jí)別和鎖的關(guān)系的講解教程