需獲取指定資料庫下所有表的名稱、行數、大小等元數據?本文提供 PHP + MySQL 完整實現代碼,並詳細解析 INFORMATION_SCHEMA.TABLES 返回的每個字段含義。
<?php
require 'class/db.php';
$sql = "SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'ecshop'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_ROWS DESC";
$arr = $db->queryArray($sql);
foreach ($arr as $v) {
echo $v->TABLE_NAME . ' - ' . $v->TABLE_ROWS . '<br>';
}
?>
| 字段名 | 含義 | 範例值 |
|---|---|---|
| TABLE_CATALOG | 目錄名 (MySQL 固定為 NULL) | NULL |
| TABLE_SCHEMA | 資料庫名稱 | leo_ecshop |
| TABLE_NAME | 表名稱 | ecs_goods |
| TABLE_TYPE | 表類型 | BASE TABLE / VIEW |
| ENGINE | 存儲引擎 | MyISAM / InnoDB |
| VERSION | 表定義版本 | 10 |
| ROW_FORMAT | 行格式 | Dynamic / Compact / Compressed |
| TABLE_ROWS | 預估行數 (InnoDB 為估算值) | 7 |
| AVG_ROW_LENGTH | 平均行長度 (位元組) | 286 |
| DATA_LENGTH | 數據文件大小 (位元組) | 2008 |
| MAX_DATA_LENGTH | 最大數據容量 | 281474976710655 |
| INDEX_LENGTH | 索引文件大小 (位元組) | 11264 |
| DATA_FREE | 已分配未使用空間 (位元組) | 0 |
| AUTO_INCREMENT | 自增下一值 | 8 |
| CREATE_TIME | 建立時間 | 2016-11-15 22:27:40 |
| UPDATE_TIME | 最後更新時間 | 2016-12-04 11:25:55 |
| CHECK_TIME | 最後檢查時間 | 2016-12-04 11:19:50 |
| TABLE_COLLATION | 校對規則 | utf8_general_ci |
| CHECKSUM | 校驗和 | NULL |
| CREATE_OPTIONS | 建立選項 | (空) |
| TABLE_COMMENT | 表備註 | (空) |
SELECT
TABLE_NAME,
ENGINE,
TABLE_ROWS,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS SIZE_MB,
ROUND(DATA_LENGTH / 1024 / 1024, 2) AS DATA_MB,
ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS INDEX_MB
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_db'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;
TABLE_ROWS 對 InnoDB 是估算值,精確行數需 SELECT COUNT(*)。DATA_FREE 顯示碎片空間,大值提示需 OPTIMIZE TABLE。INFORMATION_SCHEMA 可能較慢,生產環境建議快取結果。