在 MySQL 數據目錄下有壹個名為 ibdata1 的文件,可以保存壹張或者多張表。
923275 12M -rw-r----- 1 mysql mysql 12M 3月 18 10:42 ibdata1
這個文件就是 MySQL 的系統表空間文件,默認為 1 個,可以有多個,只需要在配置文件 my.cnf 裏面這樣定義即可。
innodb_data_file_path=ibdata1:200M;ibdata2:200M:autoextend:max:800M系統表空間不僅可以是文件系統組成的文件,也可以是非文件系統組成的磁盤塊,比如裸設備,定義也很簡單innodb_data_file_path=/dev/nvme0n1p1:3Gnewraw;/dev/nvme0n1p2:2Gnewraw
系統表空間裏都有些啥內容?
具體內容包括:double writer buffer、 change buffer、數據字典(MySQL 8.0 之前)、表數據、表索引。
那 MySQL 為什麽現在主流版本默認都不是系統表空間?
究其原因,系統表空間有三個最大的缺點:原因 1:無法做到自動收縮磁盤空間,造成很大的空間浪費。即使它包含的表都被刪掉,這部分空間也不會自動釋放。
二、單表空間
單表空間不同於系統表空間,每個表空間和表是壹壹對應的關系,每張表都有自己的表空間。具體在磁盤上表現為後綴為 .ibd 的文件。比如表 t1,對應的表空間文件為 t1.ibd917107 96K -rw-r----- 1 mysql mysql 96K 3月 18 16:13 t1.ibd
單表空間如何應用到具體的表呢?
有兩種方式:方式 1:在配置文件中開啟。在配置文件中開啟單表空間設置參數 innodb_filer_per_table,這樣默認對當前庫下所有表開啟單表空間。innodb_file_per_table=1另外也可以直接建表時指定單表空間mysql> create table t1 (id int, r1 char(36)) tablespace innodb_file_per_table;
Query OK, 0 rows affected (0.04 sec)
單表空間除了解決之前說的系統表空間的幾個缺點外,還有其他的優點,詳細如下:
1. truncate table 操作比其他的任何表空間都快;
2. 可以把不同的表按照使用場景指定在不同的磁盤目錄;
比如日誌表放在慢點的磁盤,把需要經常隨機讀的表放在 SSD 上等。
mysql> create table ytt_dedicated (id int) data directory = '/var/lib/mysql-files';
Query OK, 0 rows affected (0.04 sec)3. 可以用 optimize table 來收縮或者重建經常增刪改查的表。壹般過程是這樣的:建立和原來表壹樣的表結構和數據文件,把真實數據復制到臨時文件,再刪掉原始表定義和數據文件,最後把臨時文件的名字改為和原始表壹樣的。
三、通用表空間
通用表空間先是出現在 MySQL Cluster 裏,也就是 NDB 引擎。從 MySQL 5.7 引入到 InnoDB 引擎。通用表空間和系統表空間壹樣,也是***享表空間。每個表空間可以包含壹張或者多張表,也就是說通用表空間和表之間是壹對多的關系。