需要列出某庫所有表、統計行數、估算大小、引擎、編碼、建表時間等元數據,直接查 information_schema.TABLES 即可,無需解析 SHOW TABLE STATUS 輸出。本文提供實用查詢模板與 PHP 代碼示例。
SELECT
TABLE_NAME,
TABLE_ROWS,
DATA_LENGTH,
INDEX_LENGTH,
DATA_LENGTH + INDEX_LENGTH AS total_size_bytes,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_size_mb,
ENGINE,
TABLE_COLLATION,
CREATE_TIME,
UPDATE_TIME,
TABLE_COMMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database_name'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_ROWS DESC;
| 欄位 | 含義 | 備註 |
|---|---|---|
| TABLE_NAME | 表名 | |
| TABLE_ROWS | 預估行數 | InnoDB 為掃描統計,**非精確值**,精確需 SELECT COUNT(*) |
| DATA_LENGTH | 資料大小(位元組) | 聚簇索引大小 |
| INDEX_LENGTH | 索引大小(位元組) | 二級索引大小 |
| ENGINE | 存儲引擎 | InnoDB, MyISAM 等 |
| TABLE_COLLATION | 表級編碼排序規則 | 如 utf8mb4_general_ci |
| CREATE_TIME | 建表時間 | |
| UPDATE_TIME | 最後更新時間 | InnoDB 不更新,僅 MyISAM 準確 |
| TABLE_COMMENT | 表註釋 |
<?php
$pdo = new PDO('mysql:host=127.0.0.1;dbname=information_schema;charset=utf8', 'user', 'pass');
$sql = "SELECT TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH, ENGINE, TABLE_COLLATION, CREATE_TIME
FROM TABLES
WHERE TABLE_SCHEMA = ? AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_ROWS DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute(['ecshop']);
$tables = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($tables as $t) {
$sizeMb = round(($t['DATA_LENGTH'] + $t['INDEX_LENGTH']) / 1024 / 1024, 2);
echo "{$t['TABLE_NAME']} - Rows: {$t['TABLE_ROWS']} - Size: {$sizeMb} MB - Engine: {$t['ENGINE']}
";
}
?>
-- 找出超過 100MB 的表
SELECT TABLE_NAME, ROUND((DATA_LENGTH+INDEX_LENGTH)/1024/1024,2) AS size_mb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_db' AND TABLE_TYPE = 'BASE TABLE'
AND (DATA_LENGTH + INDEX_LENGTH) > 100*1024*1024
ORDER BY size_mb DESC;
TABLE_ROWS 對 InnoDB **不準確**,僅供參考;精確行數必須 SELECT COUNT(*)(會掃描聚簇索引,大表慎用)。DATA_LENGTH、INDEX_LENGTH 為邏輯大小,**不含碎片、壓縮後大小**;實際磁碟佔用參考 information_schema.INNODB_SYS_TABLESPACES 或檔案系統 du。information_schema 在表極多(>10萬)時可能較慢,建議緩存結果或定時同步至元數據表。善用 information_schema,讓 Schema 巡檢、容量規劃、清理無用表變成幾條 SQL 的事兒。