php - mysqli_result 是否需要一个活动连接来寻找结果?
问题描述
我们注意到对我们 API 端点的调用通常有多个重复的 MySQLSELECT
语句查询(有时有数百个)。所以我们决定创建一个 hashmap 来存储
mysqli_result
并检查给定的查询是否已经完成并返回保存在我们的 map 中的结果。
我的问题是:mysqli_result
保持对我们连接的引用吗?这真的会帮助我们避免不必要地请求的查询使我们的数据库过载吗?如果mysqli_result
太大,这会溢出我们fpm
进程的内存吗?
我想知道的基本上是哪种方法更好:
mysqli_result
对于查询 A,每次需要时重用对象;- 每次需要时重做查询 A。
解决方案
mysqli_result()
mysqli
从 MySQL 获取结果后,既不需要与 MySQL 的连接,也不需要对象。
警告:以上仅适用于缓冲查询。如果您使用的是无缓冲结果集,则mysqli_result
需要一个打开的 mysqli 连接来获取数据,否则您将收到一条错误消息:
PHP 警告:mysqli_result::fetch_all(): 读取一行时出错...
但是,只有在使用无缓冲查询时关闭连接时才会出现此错误消息。例如
$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查询结果缓存插件
并且一如既往地记住:
过早优化是万恶之源
推荐阅读
- sql-server - “代替删除触发器”触发两次
- python - 使用 Python 3 在后台线程中加载数据
- count - PowerBi Desktop:不同的度量缺失值
- javascript - 如何替换 javascript 标准内置对象?
- python - yaml.constructor.ConstructorError:在构建 Python 对象时,在模块“__main__”中找不到“module_name”
- solr - solr DateFormatTransporter
- r - 如何使用 R 中的 ggplot 绘制 x 中的向量和 y 中数据框的行?
- python - 如何将文本字符串插入到 ttk 条目中?[解决了]
- jdbc - 如果使用 setFetchSize 在 JDBC 中批量读取,如果我们对语句应用超时,那么它是批处理级别的超时吗?
- c# - 使用嵌入式文件(.exe 或 .msi)打包 dotnet 核心控制台应用程序