目錄
什麼是表空間
默認情況下,InnoDB只包含一個稱爲系統表空間的表空間,其標識符爲0.可以使用innodb_file_per_table配置參數間接創建更多表空間。表空間由一系列文件組成。文件的大小不必被數據庫塊大小整除,因爲我們可能只保留最後一個未完成的塊。將新文件追加到表空間時,還會指定文件的最大大小。目前,我們認爲最好在創建文件時將文件擴展到其最大大小,因爲當表空間需要更多空間時,我們可以避免動態擴展文件。數據文件是動態擴展的,但重做日誌文件是預先分配的。另外,如前所述,只有系統表空間可以有多個數據文件。還清楚地提到,即使表空間可以有多個文件,它們也被認爲是連接在一起的單個大文件。因此表空間中文件的順序很重要。
一個數據文件,可以保存一個或多個InnoDB表和相關索引的數據。
根據每個表的信息通道配置,有許多類型的表空間。這些是,
a:系統表空間
b:每個表空間的文件
c:常規表空間
系統表空間包含,
- InnoDB數據字典。
- DoubleWrite緩衝區。
- 改變緩衝區
- 撤消日誌。
除此之外它還包含,
- 表
- 索引數據
相關文件是 .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。運行結果如下圖所示: