當前位置: 首頁> 最新文章列表> 使用mysqli::$info 了解MySQL 查詢執行的統計信息

使用mysqli::$info 了解MySQL 查詢執行的統計信息

gitbox 2025-05-26

在使用PHP進行MySQL數據庫操作時,開發者通常更關注查詢結果本身,例如返回的行數或是否執行成功,而容易忽略一個有用的調試工具—— mysqli::$info屬性。這個屬性在某些類型的SQL語句執行後,能夠返回關於執行結果的更多統計信息,幫助我們更全面地了解一次查詢的影響。

什麼是mysqli::$info?

mysqli::$infomysqli類的一個只讀屬性,用來提供最後執行的SQL 語句的一些統計信息,特別適用於INSERTUPDATELOAD DATA等修改型語句。

該屬性的返回值是一個字符串,內容格式不固定,但通常包含受影響的行數、重複的行數、被警告的行數等信息。例如:

 $mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
echo $mysqli->info;

可能輸出如下信息:

 Rows matched: 15  Changed: 15  Warnings: 0

這告訴我們,共有15條記錄被匹配,15條記錄被修改,沒有發生任何警告。

返回值格式解析

mysqli::$info返回的是一個格式化的字符串。以下是常見的返回關鍵字:

  • Records :被處理的記錄數(多用於LOAD DATA

  • Duplicates :重複的記錄數(常見於INSERT ... ON DUPLICATE KEY UPDATE

  • Warnings :執行過程中出現的警告數

  • Rows matched :匹配的行數(通常用於UPDATEDELETE

  • Changed :真正被改變的行數(表示字段值實際變化)

例如:

 $mysqli->query("INSERT INTO logs (event, created_at) VALUES ('login', NOW()), ('logout', NOW())");
echo $mysqli->info;

輸出可能為:

 Records: 2  Duplicates: 0  Warnings: 0

這表明插入了兩條記錄,沒有重複,也沒有警告。

配合日誌系統進行優化分析

通過結合mysqli::$info與日誌記錄系統,我們可以對數據庫操作的影響進行細緻分析。例如:

 $mysqli->query("UPDATE products SET stock = stock - 1 WHERE id = 101");
$log = sprintf("Query info: %s", $mysqli->info);
file_put_contents("/var/log/db_ops.log", $log . PHP_EOL, FILE_APPEND);

這樣,每次更新庫存時都能記錄受影響的行數,有助於後期調試和性能優化。

注意事項

  1. 僅在支持的語句後有意義:如SELECT查詢通常返回空字符串。

  2. 不能代替error 處理機制:它不是錯誤報告工具,而是執行影響的補充信息。

  3. 多語句執行時只反映最後一條語句:如果使用多語句查詢,僅能反映最後一條的執行情況。

  4. 語言版本差異:不同MySQL 和PHP 版本間,輸出字符串的結構可能略有不同。

小結

mysqli::$info是一個簡單卻實用的調試工具,能夠在執行非查詢類SQL 語句時提供詳盡的統計信息。它對於調試、日誌記錄及查詢優化提供了重要的參考數據。在高性能或對數據變化敏感的應用中,合理使用它能顯著提升系統的可觀察性。

更多關於該屬性的官方文檔可參考: https://gitbox.net/php/mysqli.info