SHOW TABLE STATUS 是獲取數據庫中所有表(含視圖)核心元數據的「瑞士軍刀」,輸出涵蓋存儲引擎、行數、數據大小、索引大小、自增值、創建時間、字符集、註釋等 18 個關鍵指標。本文通過實例輸出逐欄深度解析,並示範如何利用這些指標進行容量規劃、性能診斷、異常發現。
mysql> USE test;
Database changed
mysql> SHOW TABLE STATUS;
+---------------+--------+---------+------------+------+----------------+----------+-----------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-----------------+----------+----------------+---------+------------------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | |
+---------------+--------+---------+------------+------+----------------+----------+-----------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-----------------+----------+----------------+---------+------------------+
| emp | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 0 | 0 | NULL | 2015-09-16 16:18:06 | NULL | NULL | utf8_general_ci | NULL | | | |
| stu_view | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | VIEW | |
| t_depart_info | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 0 | 0 | NULL | 2015-08-23 22:12:02 | NULL | NULL | utf8_general_ci | NULL | | | |
| t_stu_info | InnoDB | 10 | Compact | 6 | 2730 | 16384 | 0 | 0 | 0 | 9 | 2015-08-23 21:36:02 | NULL | NULL | utf8_general_ci | NULL | | | |
| t_tea_info | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 16384 | 0 | 1 | 2015-08-23 21:39:53 | NULL | NULL | utf8_general_ci | NULL | | | |
+---------------+--------+---------+------------+------+----------------+----------+-----------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-----------------+----------+----------------+---------+------------------+
| 欄位名 | 含義 | 核心價值與解讀 |
|---|---|---|
| Name | 對象名稱(表/視圖) | 配合 Comment 識別業務實體 |
| Engine | 存儲引擎 | InnoDB (事務、行鎖、外鍵)、MyISAM (全文索引、只讀)、MEMORY、CSV 等。NULL 表示視圖 |
| Version | 表定義版本號(.frm 文件版本) | InnoDB 通常為 10,MyISAM 為 1。ALTER TABLE 會遞增 |
| Row_format | 行存儲格式 | Compact (5.1+ 默認)、Dynamic (5.7+ 默認、支援大字段溢出頁)、Compressed、Redundant (舊版)。影響存儲效率與大字段處理 |
| Rows | 估算行數(非精確值) | InnoDB 基於統計信息採樣估算,誤差可達 40%-50%。精確行數必須用 SELECT COUNT(*)。 視圖為 NULL |
| Avg_row_length | 平均行長度(字節) | Data_length / Rows 估算值。結合 Rows 可粗略驗證數據密度 |
| Data_length | 數據文件大小(字節) | InnoDB 為聚簇索引 (數據+主鍵) 大小。不包含二級索引。16384 = 16KB (一個 extent) |
| Max_data_length | 最大數據文件大小限制 | InnoDB 為 0 (無上限,受表空間/文件系統限制)。MyISAM 受指針大小限制 (4GB/256TB) |
| Index_length | 索引文件大小(字節) | 二級索引大小。若遠大於 Data_length,說明索引過多或冗余,需審查索引策略 |
| Data_free | 已分配但未使用的空間(字節) | InnoDB 表空間碎片指標。持續增大說明頻繁 DELETE/UPDATE 產生碎片,需 OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 整理 |
| Auto_increment | 下一個自增值 | 監控自增 ID 消耗速度,預防 BIGINT 耗盡風險。視圖/無自增列為 NULL |
| Create_time | 創建時間 | 審計、變更追蹤 |
| Update_time | 最後數據修改時間 | InnoDB 不實時更新 (受 innodb_stats_persistent 影響),可為 NULL。MyISAM 準確。不可作為精確修改時間依據 |
| Check_time | 最後 CHECK TABLE 時間 | 維護記錄 |
| Collation | 表默認排序規則 | 影響字符比較、排序、索引。應與 character-set-server 一致 |
| Checksum | 校驗和 (MyISAM 支援) | InnoDB 為 NULL |
| Create_options | 創建時附加選項 | 如 PARTITIONED, ROW_FORMAT=COMPRESSED, ENCRYPTION='Y' |
| Comment | 表註釋 / 對象類型 | 視圖顯示 VIEW,普通表可寫業務說明 |
SHOW TABLE STATUS LIKE 't_stu_info';
-- 或
SHOW TABLE STATUS FROM test LIKE 't_stu_info';
SELECT
TABLE_NAME,
DATA_LENGTH,
INDEX_LENGTH,
DATA_FREE,
ROUND(DATA_FREE / (DATA_LENGTH + INDEX_LENGTH) * 100, 2) AS frag_pct
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'test' AND DATA_FREE > 0
ORDER BY frag_pct DESC;
整理命令: OPTIMIZE TABLE t_stu_info; (重建表,釋放碎片,需鎖表,大表謹慎)。
SELECT
TABLE_NAME,
AUTO_INCREMENT,
CASE
WHEN AUTO_INCREMENT IS NULL THEN 'N/A'
WHEN DATA_TYPE = 'bigint' THEN CONCAT(ROUND(AUTO_INCREMENT / 18446744073709551615 * 100, 4), '%')
WHEN DATA_TYPE = 'int' THEN CONCAT(ROUND(AUTO_INCREMENT / 4294967295 * 100, 4), '%')
END AS usage_pct
FROM information_schema.TABLES t
JOIN information_schema.COLUMNS c ON t.TABLE_SCHEMA=c.TABLE_SCHEMA AND t.TABLE_NAME=c.TABLE_NAME
WHERE t.TABLE_SCHEMA='test' AND c.COLUMN_KEY='PRI' AND c.EXTRA='auto_increment';
SELECT TABLE_NAME, DATA_LENGTH, INDEX_LENGTH,
ROUND(INDEX_LENGTH / DATA_LENGTH * 100, 1) AS idx_data_ratio
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='test' AND DATA_LENGTH > 0
ORDER BY idx_data_ratio DESC;
-- 比率 > 200% 需審查:是否有冗余索引、未使用索引、過長聯合索引
SELECT TABLE_NAME, ENGINE, COMMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='test'
ORDER BY ENGINE IS NULL, TABLE_NAME;
-- ENGINE=NULL 且 COMMENT='VIEW' 為視圖
SHOW TABLE STATUS 輸出的每一欄都是數據庫健康狀態的「體檢指標」:Rows 估算誤差大需警惕,Data_free 揭示碎片積累,Index_length/Data_length 比率暴露索引設計質量,Auto_increment 預警 ID 耗盡風險,Update_time 在 InnoDB 下不可盡信。善用 information_schema.TABLES 將這些指標轉化為可視化監控儀表盤,讓表級運維從「感覺駕駛」進化為「數據駕駛」。