Mysqli:在use_result之后跳过行

时间:2017-11-10 14:50:23

标签: php mysql mysqli mysqlnd unbuffered-queries

我将任意多语句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)时会忽略此限制。

1 个答案:

答案 0 :(得分:5)

你要做的事情被称为野蛮行为 这不是你丢弃查询结果的问题,这是一个问题。

在外行人看来,你的问题很像:

  

我需要一个篝火给自己煮一杯茶。砍下一些树干是太多的工作;我确实有很多炸药,所以我只是吹了整个森林。这很好用,我的篝火很完美。但现在我不需要躺在周围的所有垃圾。怎么能让它在一阵烟雾中消失?

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

您的想法与您的想法完全相同。你浪费了很多资源,无论是在PHP还是MySQL方面,当你只需要几行时,就会导致MySQL服务器加载大量数据。即使清除结果集所花费的时间也没有暗示你做错了什么。

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

在一条现已删除的评论中,您声明自己正在使用另一个phpmyadmin"。所以只需执行phpmyadmin所做的事情 - 解析SQL并在查询中添加LIMIT部分