information_schema 是 MySQL 5.0+ 引入的虛擬資料庫,**不佔用磁盤空間**,提供統一的元數據訪問介面(即「數據字典」)。所有表皆為記憶體臨時表,查詢即時反映實例狀態。
| 表名 | 用途 | 對應 SHOW 命令 |
|---|---|---|
| SCHEMATA | 所有資料庫信息 | SHOW DATABASES |
| TABLES | 表/視圖信息(引擎、建表時間等) | SHOW TABLES FROM db |
| COLUMNS | 列定義(類型、預設值、註釋) | SHOW COLUMNS FROM db.tbl |
| STATISTICS | 索引詳情 | SHOW INDEX FROM db.tbl |
| USER_PRIVILEGES | 全局權限 | — |
| SCHEMA_PRIVILEGES | 資料庫級權限 | — |
| TABLE_PRIVILEGES | 表級權限 | — |
| COLUMN_PRIVILEGES | 列級權限 | — |
| CHARACTER_SETS | 字符集列表 | SHOW CHARACTER SET |
| COLLATIONS | 校對規則 | SHOW COLLATION |
| TABLE_CONSTRAINTS | 約束信息(PK、FK、UNIQUE) | — |
| KEY_COLUMN_USAGE | 約束涉及的鍵列 | — |
| ROUTINES | 存儲過程/函數 | SHOW PROCEDURE STATUS |
| VIEWS | 視圖定義 | SHOW TABLES ... WHERE Table_type='VIEW' |
| TRIGGERS | 觸發器(需 SUPER 權限) | SHOW TRIGGERS |
-- 1. 查找所有無主鍵的表
SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')
AND TABLE_NAME NOT IN (
SELECT TABLE_NAME FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
);
-- 2. 查詢大表(>1GB)及其引擎
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE,
ROUND((DATA_LENGTH + INDEX_LENGTH)/1024/1024/1024, 2) AS size_GB
FROM information_schema.TABLES
WHERE (DATA_LENGTH + INDEX_LENGTH) > 1024*1024*1024
ORDER BY size_GB DESC;
-- 3. 找出未使用 utf8mb4 的表
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8mb4%';
*_PRIVILEGES)為**非標準表**,直接映射 mysql 系統庫授權表,僅供讀取,不可 DML。mysql.* 數據字典表,information_schema 為兼容層,部分查詢會轉向新字典。