mysqli_result 需要在线连接才能搜索结果吗?

Do mysqli_result need an alive connection to seek results?

我们注意到对 API 端点的调用通常有多个重复的 MySQL 查询 SELECT 语句(有时数百个)。所以我们决定创建一个 hashmap 来存储 mysqli_result 并检查给定的查询是否已经完成并且 return 结果保存在我们的地图中。

我的问题是:mysqli_result 是否维护对我们连接的引用?这真的能帮助我们避免数据库因不必要的请求而超载吗?如果 mysqli_result 太大,这会溢出我们 fpm 进程的内存吗?

我想知道的基本上是哪种方法更好:

一旦从 MySQL.

获取结果,

mysqli_result() 既不需要连接到 MySQL 也不需要 mysqli 对象

警告: 以上仅适用于缓冲查询。如果您使用的是无缓冲结果集,那么 mysqli_result 需要一个打开的 mysqli 连接来获取数据,否则您将收到一条错误消息:

PHP Warning: mysqli_result::fetch_all(): Error while reading a row in ...

但是,只有在使用无缓冲查询时关闭连接时才会出现此错误消息。例如

$res = $mysqli->query('SELECT id FROM Users LIMIT 1', MYSQLI_USE_RESULT);
$mysqli->close();
$res->fetch_all();

即使 mysqli_result 在创建它的实例时需要有效连接,它只需要连接来获取数据。 mysqli_result::__construct() 中的第二个参数用于决定结果集是缓存在PHP 中还是存储在MySQL 服务器上并逐行获取。当你创建一个 mysqli_result 的实例时,你需要传递一个 mysqli 的实例作为第一个参数。

// Execute query on MySQL server
$res = $mysqli->real_query('SELECT id FROM Users LIMIT 1');
// Create the result object. 
// The second argument can be MYSQLI_STORE_RESULT for buffered result or MYSQLI_USE_RESULT for unbuffered.
$res = new mysqli_result($mysqli, MYSQLI_STORE_RESULT);

// If MYSQLI_STORE_RESULT was used then you can close mysqli here.
unset($mysqli); // or $mysqli->close(); or both
$data = $res->fetch_all();

// If MYSQLI_USE_RESULT was used then you can't close mysqli yet.
// unset($mysqli);
$data = $res->fetch_all();

缓冲 SQL 查询是一项相当复杂的任务,最好避免重复调用而不是实施缓存。尝试重构您的代码,使其在脚本执行期间不会多次调用相同的 SELECT 查询。

虽然不是很流行,但也有一个预制的解决方案。 Mysqlnd query result cache plugin

一如既往地记住:

premature optimization is the root of all evil