当前位置: 首页> 最新文章列表> 使用 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