開發資料庫應用時,常需程式化獲取三類元數據:查詢影響行數、表/資料庫結構、服務器狀態與版本。本文整理 MySQL 官方命令、Perl DBI、PHP (mysqli/PDO) 三種語言的標準調用方式,並列出常用 SHOW / INFORMATION_SCHEMA 查詢速查表。
| 語言/驅動 | 方法/函數 | 備註 |
|---|---|---|
| MySQL CLI | 查詢結果自動顯示 N rows affected | 互動模式直接可見 |
| Perl DBI | $dbh->do($sql) 或 $sth->execute() 回傳值 | 若失敗回傳 undef,需 defined 判斷 |
| PHP mysqli | mysqli_affected_rows($link) | 需在 mysqli_query() 後立即呼叫 |
| PHP PDO | $stmt->rowCount() | 僅對 DELETE/UPDATE/INSERT 有效,SELECT 不保證 |
-- SQL 方式(通用) SHOW DATABASES; SHOW TABLES [FROM db_name]; SHOW TABLE STATUS [FROM db_name]; -- 含引擎、行數、大小等詳細資訊
my @dbs = $dbh->func('_ListDBs'); # 或 $dbh->selectcol_arrayref('SHOW DATABASES');
my @tables = $dbh->tables(undef, $schema, undef, 'TABLE');
$result = mysqli_query($link, 'SHOW DATABASES');
while ($row = mysqli_fetch_row($result)) { echo $row[0] . "\n"; }
$stmt = $pdo->query('SHOW TABLES');
while ($row = $stmt->fetch(PDO::FETCH_NUM)) { print_r($row); }
DESC `table_name`; -- 簡略欄位資訊 SHOW COLUMNS FROM `table_name`; -- 等同 DESC SHOW CREATE TABLE `table_name`; -- 完整建表語句 SHOW INDEX FROM `table_name`; -- 索引詳情 -- INFORMATION_SCHEMA 更靈活 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='db' AND TABLE_NAME='t'; SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='db' AND TABLE_NAME='t';
-- 版本、編譯資訊 SELECT VERSION(); SHOW VARIABLES LIKE '%version%'; -- 運行狀態(連線、緩衝區、InnoDB 指標等) SHOW GLOBAL STATUS; SHOW ENGINE INNODB STATUS; -- InnoDB 內部狀態(鎖、事務、Buffer Pool 等) -- 當前連線資訊 SHOW PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
| 需求 | SQL |
|---|---|
| 所有使用者帳號 | SELECT User, Host FROM mysql.user; |
| 某使用者權限 | SHOW GRANTS FOR 'user'@'host'; |
| 資料庫大小 | SELECT TABLE_SCHEMA, SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024 AS MB FROM INFORMATION_SCHEMA.TABLES GROUP BY TABLE_SCHEMA; |
| 表大小與行數 | SELECT TABLE_NAME, TABLE_ROWS, (DATA_LENGTH+INDEX_LENGTH)/1024/1024 AS MB FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db'; |
| 找出無主鍵的表 | SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema') AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='PRIMARY KEY' AND TABLE_SCHEMA=t.TABLE_SCHEMA AND TABLE_NAME=t.TABLE_NAME); |
| 檢視表碎片率 | SELECT TABLE_NAME, DATA_FREE/1024/1024 AS Frag_MB FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db' AND DATA_FREE > 0; |
INFORMATION_SCHEMA 查詢,標準化、可過濾、可 JOIN,避免解析 SHOW 輸出格式差異。mysqli 僅維舊專案用。SELECT * 查詢 INFORMATION_SCHEMA 大表(如 COLUMNS、STATISTICS),務必加 WHERE TABLE_SCHEMA=? 過濾。SHOW GLOBAL STATUS 關鍵指標(Threads_connected、Innodb_buffer_pool_reads、Slow_queries 等)寫入監控系統。掌握元數據獲取技巧,能讓運維腳本、監控系統、自動化部署工具更健壯、更通用。