首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 元數據獲取全攻略:查詢結果、表結構、服務器狀態的多語言調用方法

     編輯:MySQL 資料庫相關知識

開發資料庫應用時,常需程式化獲取三類元數據:查詢影響行數、表/資料庫結構、服務器狀態與版本。本文整理 MySQL 官方命令、Perl DBI、PHP (mysqli/PDO) 三種語言的標準調用方式,並列出常用 SHOW / INFORMATION_SCHEMA 查詢速查表。

一、獲取查詢影響行數

語言/驅動方法/函數備註
MySQL CLI查詢結果自動顯示 N rows affected互動模式直接可見
Perl DBI$dbh->do($sql) 或 $sth->execute() 回傳值若失敗回傳 undef,需 defined 判斷
PHP mysqlimysqli_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];  -- 含引擎、行數、大小等詳細資訊

Perl DBI

my @dbs = $dbh->func('_ListDBs');  # 或 $dbh->selectcol_arrayref('SHOW DATABASES');
my @tables = $dbh->tables(undef, $schema, undef, 'TABLE');

PHP mysqli

$result = mysqli_query($link, 'SHOW DATABASES');
while ($row = mysqli_fetch_row($result)) { echo $row[0] . "\n"; }

PHP PDO

$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;

六、最佳實踐建議

  1. 優先使用 INFORMATION_SCHEMA 查詢,標準化、可過濾、可 JOIN,避免解析 SHOW 輸出格式差異。
  2. PHP 新專案請使用 PDO,支援預處理、多資料庫、異常處理,mysqli 僅維舊專案用。
  3. 生產環境嚴禁使用 SELECT * 查詢 INFORMATION_SCHEMA 大表(如 COLUMNS、STATISTICS),務必加 WHERE TABLE_SCHEMA=? 過濾。
  4. 定期收集 SHOW GLOBAL STATUS 關鍵指標(Threads_connected、Innodb_buffer_pool_reads、Slow_queries 等)寫入監控系統。

掌握元數據獲取技巧,能讓運維腳本、監控系統、自動化部署工具更健壯、更通用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved