1. 程式人生 > 資料庫 >詳解MySQL中InnoDB的儲存檔案

詳解MySQL中InnoDB的儲存檔案

從物理意義上來講,InnoDB表由共享表空間檔案(ibdata1)、獨佔表空間檔案(ibd)、表結構檔案(.frm)、以及日誌檔案(redo檔案等)組成。

1、表結構檔案

在MYSQL中建立任何一張資料表,在其資料目錄對應的資料庫目錄下都有對應表的.frm檔案,.frm檔案是用來儲存每個資料表的元資料(meta)資訊,包括表結構的定義等,.frm檔案跟資料庫儲存引擎無關,也就是任何儲存引擎的資料表都必須有.frm檔案,命名方式為資料表名.frm,如user.frm. .frm檔案可以用來在資料庫崩潰時恢復表結構。

2、表空間檔案

(1)表空間結構分析

以下為InnoDB的表空間結構圖:

資料段即B+樹的葉子節點,索引段即為B+樹的非葉子節點InnoDB儲存引擎的管理是由引擎本身完成的,表空間(Tablespace)是由分散的段(Segment)組成。一個段(Segment)包含多個區(Extent)。

區(Extent)由64個連續的頁(Page)組成,每個頁大小為16K,即每個區大小為1MB,建立新表時,先使用32頁大小的碎片頁存放資料,使用完後才是區的申請(InnoDB最多每次申請4個區,保證資料的順序效能)
頁型別有:資料頁、Undo頁、系統頁、事務資料頁、插入緩衝點陣圖頁、以及插入緩衝空閒列表頁。

(2)獨佔表空間檔案

若將innodb_file_per_table設定為on,則系統將為每一個表單獨的生成一個table_name.ibd的檔案,在此檔案中,儲存與該表相關的資料、索引、表的內部資料字典資訊。

(3)共享表空間檔案

在InnoDB儲存引擎中,預設表空間檔案是ibdata1(主要儲存的是共享表空間資料),初始化為10M,且可以擴充套件,如下圖所示:

實際上,InnoDB的表空間檔案是可以修改的,使用以下語句就可以修改:

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

使用共享表空間儲存方式時,Innodb的所有資料儲存在一個單獨的表空間裡面,而這個表空間可以由很多個檔案組成,一個表可以跨多個檔案存在,所以其大小限制不再是檔案大小的限制,而是其自身的限制。從Innodb的官方文件中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,當然這個大小是包括這個表的所有索引等其他相關資料。

而在使用單獨表空間儲存方式時,每個表的資料以一個單獨的檔案來存放,這個時候的單表限制,又變成檔案系統的大小限制了。

以下即為不同平臺下,單獨表空間檔案最大限度。

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文件中的內容:

Windows使用者請注意: FAT和VFAT (FAT32)不適合MySQL的生產使用。應使用NTFS。

(4)共享表空間與獨佔表空間

共享表空間以及獨佔表空間都是針對資料的儲存方式而言的。

共享表空間: 某一個數據庫的所有的表資料,索引檔案全部放在一個檔案中,預設這個共享表空間的檔案路徑在data目錄下。 預設的檔名為:ibdata1 初始化為10M。

獨佔表空間: 每一個表都將會生成以獨立的檔案方式來進行儲存(.ibd檔案,這個檔案包括了單獨一個表的資料內容以及索引內容)。

1)儲存內容比較

使用獨佔表空間之後:

每個表對應的資料、索引和插入緩衝 存放在獨佔表空間(.idb檔案)

每個表對應的撤銷(undo)資訊,系統事務資訊,二次寫緩衝等還是存放在了原來的共享表空間內(ibdata1檔案)

2)特點比較

具體的共享表空間和獨立表空間優缺點如下:

共享表空間:

優點:

可以放表空間分成多個檔案存放到各個磁碟上(表空間檔案大小不受表大小的限制,如一個表可以分佈在不同的檔案上)。

資料和檔案放在一起方便管理。

缺點:

所有的資料和索引存放到一個檔案中,則將有一個很常大的檔案,雖然可以把一個大檔案分成多個小檔案,但是多個表及索引在表空間中混合儲存,這樣對於一個表做了大量刪除操作後表空間中將會有大量的空隙,特別是對於統計分析,日誌系統這類應用最不適合用共享表空間。

獨立表空間:(在配置檔案(my.cnf)中設定 innodb_file_per_table)

優點:

  1. 每個表都有自已獨立的表空間。
  2. 每個表的資料和索引都會存在自已的表空間中。
  3. 可以實現單表在不同的資料庫中移動。
  4. 空間可以回收

對於使用獨立表空間的表,不管怎麼刪除,表空間的碎片不會太嚴重的影響效能,而且還有機會處理。

a)Drop table操作自動回收表空間

b)如果對於統計分析或是日值表,刪除大量資料後可以通過:alter table TableName engine=innodb;回縮不用的空間。

c) 對於使innodb-plugin的Innodb使用truncate table也會使空間收縮。

5、在伺服器資源有限,單表資料不是特別多的情況下,獨立表空間明顯比共享方式效率更高 . 但是MySQL 預設是共享表空間 。

缺點:

單表體積可能過大,如超過100個G。

3)共享表空間以及獨佔表空間之間的轉化

修改獨佔空表空間配置,配置以下引數

innodb_data_home_dir = "/user/local/mysql/var" 資料庫檔案所存放的目錄

innodb_log_group_home_dir = "/user/local/mysql/var" 日誌存放目錄

innodb_data_file_path=ibdata1:10M:autoextend 設定配置一個可擴充套件大小的尺寸為10MB的單獨檔案(共享資料檔案),名為ibdata1。沒有給出檔案的位置,所以預設的是在MySQL的資料目錄內。

innodb_file_per_table=1 是否使用共享還是獨佔表空間 (1:為使用獨佔表空間,0:為使用共享表空間)

檢視innodb_file_per_table 變數,如果為OFF說明所使用的是共享表空間(預設情況下,所使用的表空間為共享表空間)

對innodb_file_per_table 進行修改時,對於之前使用過的共享表空間不會影響,除非手動的去進行修改

注意:

InnoDB不建立目錄,所以在啟動伺服器之前請確認所配置的路徑目錄存在。

做資料的移植以及備份時,要注意資料檔案的完整性.