共計 2024 個字符,預計需要花費 6 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關怎么理解 MySQL InnoDB 的存儲結構,文章內容質量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
從物理意義上來講,InnoDB 表由共享表空間、日志文件組(redo 文件組)、表結構定義文件組成。若將 innodb_file_per_table 設置為 on,則系統將為每一個表單獨的生成一個 table_name.ibd 的文件,
在此文件中,存儲與該表相關的數據、索引、表的內部數據字典信息。表結構文件則以.frm 結尾,這與存儲引擎無關。
以下為 InnoDB 的表空間結構圖:
在 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。
共享表空間與獨占表空間可以通過參數 innodb_file_per_table 來轉換,若為 1,則開啟獨占表空間,否則,開啟共享表存儲。
在服務器資源有限, 單表數據不是特別多的情況下, 獨立表空間明顯比共享方式效率更高 . 但是 MySQL 默認是共享表空間。
具體的共享表空間和獨立表空間優缺點如下:
共享表空間:
優點:
可以放表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表可以分布在不同步的文件上)。數據和文件放在一起方便管理。
缺點:
所有的數據和索引存放到一個文件中以為著將有一個很常大的文件,雖然可以把一個大文件分成多個小文件,但是多個表及索引在表空間中混合存儲,這樣對于一個表做了大量刪除操作后表空間中將會
有大量的空隙,特別是對于統計分析,日值系統這類應用最不適合用共享表空間。
獨立表空間:在配置文件(my.cnf)中設置:innodb_file_per_table
優點:
1. 每個表都有自已獨立的表空間。
2. 每個表的數據和索引都會存在自已的表空間中。
3. 可以實現單表在不同的數據庫中移動。
4. 空間可以回收(除 drop table 操作處,表空不能自已回收)
a) Drop table 操作自動回收表空間,如果對于統計分析或是日值表,刪除大量數據后可以通過:alter table TableName engine=innodb; 回縮不用的空間。
b) 對于使 innodb-plugin 的 Innodb 使用 truncate table 也會使空間收縮。
c) 對于使用獨立表空間的表,不管怎么刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。
缺點:
單表增加過大,如超過 100 個 G。
※ 對于啟用了 innodb_file_per_table 的參數選項之后,在每個表對應的.idb 文件內只是存放了數據、索引和插入緩沖,而撤銷(undo)信息,系統事務信息,二次寫緩沖等還是存放在了原來的共享表空間內。
※ 數據段即 B + 樹的葉節點,索引段即為 B + 樹的非索引節點。
※ InnoDB 存儲引擎的管理是由引擎本身完成的,表空間是由分散的頁和段組成。
※ 區由 64 個連續的頁組成,每個頁大小為 16K,即每個區大小為 1MB,創建新表時,先有 32 頁大小的碎片頁存放數據,使用完后才是區的申請,(InnoDB 最多每次申請 4 個區,保證數據的順序性能)
※ 頁類型有:數據頁、Undo 頁、系統頁、事務數據頁、插入緩沖位圖頁、以及插入緩沖空閑列表頁。
關于怎么理解 MySQL InnoDB 的存儲結構就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。