Mysqli:在use_result之后跳过行



我将任意多语句SQL传递给Mysqli(使用mysqlnd)并检索结果集。SELECT语句可以包含(或不包含)LIMIT子句。我需要的是将提取的行限制为1000行(硬编码限制)。这就是我所拥有的:

define('SAFE_ROWS', 1000); // strict limit
$sql = "SELECT * FROM table1 LIMIT 99999999";
$mysqli->multi_query($sql);
// unbuffered: results are stored at MySQL-side
// and transfer when i call fetch*
$result = $mysqli->use_result();
$rows = [];
while ($row = $result->fetch_array()) {
if (count($rows) >= SAFE_ROWS) {
#############################################
# QUESTION: what i have to do here          #
# to skip remaining rows of current result? #
#############################################
break;
}
$rows[] = $row;
}
// As slow as much rows remained unfetched:
$result->free();

如果当前结果中有很多未填充的行,则释放结果会花费太多时间。有没有办法告诉MySQL"我不再需要这个结果的剩余行了,把它埋了"?

PS。我知道SQL_SELECT_LIMIT选项,但当选择限制明显设置(SELECT * FROM t1 LIMIT 99999999)时,会忽略此限制。

你要做的事情叫做野蛮
这不是你的问题,丢弃查询结果在这里是个问题。

用外行的话来说,你的问题很像:

我需要一堆篝火给自己煮一杯茶。砍下几根树干工作量太大;我确实有一吨炸药,所以我把整个森林都炸了。这一切都很好,我的篝火很完美。但现在我不需要到处都是垃圾了。我怎样才能让它消失在一股烟雾中?

这里的主要问题是一个不再存在的森林。

按照你的想法,你也在做同样的事情。您在PHP和MySQL端浪费了大量资源,导致MySQL服务器在只需要几行的情况下加载了大量数据。即使清除结果集所花费的时间也不会暗示你做错了什么。

好吧,你会发现在一秒钟内丢弃几GB数据的神奇方法。但这些千兆字节必须首先收集起来。当你自制的phpmyadmin会杀死数据库服务器时,它的用户不会像你期望的那样感激。

在一条现已删除的评论中,您表示"正在开发另一个phpmyadmin"。因此,只需执行phpmyadmin所做的操作-解析SQL并向查询添加LIMIT部分

最新更新