什么是表空間
默認情況下,InnoDB只包含一個稱為系統表空間的表空間,其標識符為0.可以使用innodb_file_per_table配置參數間接創建更多表空間。表空間由一系列文件組成。文件的大小不必被數據庫塊大小整除,因為我們可能只保留最后一個未完成的塊。將新文件追加到表空間時,還會指定文件的最大大小。目前,我們認為最好在創建文件時將文件擴展到其最大大小,因為當表空間需要更多空間時,我們可以避免動態擴展文件。數據文件是動態擴展的,但重做日志文件是預先分配的。另外,如前所述,只有系統表空間可以有多個數據文件。還清楚地提到,即使表空間可以有多個文件,它們也被認為是連接在一起的單個大文件。因此表空間中文件的順序很重要。
一個數據文件,可以保存一個或多個InnoDB表和相關索引的數據。
根據每個表的信息通道配置,有許多類型的表空間。這些是,
a:系統表空間
b:每個表空間的文件
c:常規表空間
系統表空間包含,
1.InnoDB數據字典。
2.DoubleWrite緩沖區。
3.改變緩沖區
4.撤消日志。
除此之外它還包含,
1.表
2.索引數據
相關文件是 .idbdata1
innodb_file_per_table選項在MySQL 5.6及更高版本中默認啟用,允許在每個表的文件表空間中創建表,每個表都有一個單獨的數據文件。啟用innodb_file_per_table選項可以使用其他MySQL功能,例如表壓縮和可傳輸表空間。相關文件是 .idbd
InnoDB在MySQL 5.7.6中引入了通用表空間。常規表空間是使用CREATE TABLESPACE語法創建的共享表空間。它們可以在MySQL數據目錄之外創建,能夠保存多個表,並支持所有行格式的表。
怎么通過SQL語句查看MySQL數據庫的表空間狀態
1. 查看數據庫的索引空間大小,運行以下SQL語句:
-- 以GB為單位
# 查看mysql庫, 如果想查看其他庫,改變結尾數據庫名稱 SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024*1024), 6), ' GB') AS 'Total Index Size' FROM information_schema.TABLES WHERE table_schema LIKE 'mysql';
-- 以MB為單位
SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 6), ' MB') AS 'Total Index Size' FROM information_schema.TABLES WHERE table_schema LIKE 'mysql';
查看數據庫中所有表的信息
在MySQL Workbench中運行以下SQL語句,查看數據庫中所有表的表名、表行數、數據空間大小、索引空間大小和總大小:
SELECT CONCAT(table_schema,'.',table_name) AS 'Table Name', table_rows AS 'Number of Rows', CONCAT(ROUND(data_length/(1024*1024),6),' MB') AS 'Data Size', CONCAT(ROUND(index_length/(1024*1024),6),' MB') AS 'Index Size', CONCAT(ROUND((data_length+index_length)/(1024*1024),6),' MB') AS'Total Size' FROM information_schema.TABLES WHERE table_schema LIKE 'database';
其中,database是待查看數據庫的名稱,例如:mysql。運行結果如下圖所示: