-1

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

4

1 回答 1

5

你要做的就是野蛮。
丢弃查询结果不是您的问题,而是这里的问题。

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

我需要篝火为自己煮一杯茶。砍掉几根树干太费力了;我确实有很多炸药,所以我炸毁了整个森林。这很好用,我的篝火很完美。但现在我不需要到处乱扔垃圾了。我怎样才能让它消失在一阵烟雾中?

这里的主要问题是一片不复存在的森林。

你的想法和你做的完全一样。您在 PHP 和 MySQL 端都浪费了大量资源,导致 MySQL 服务器加载大量数据,而您只需要几行。甚至清除结果集所花费的时间也不会暗示您做错了什么。

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

在现已删除的评论中,您说您正在“在另一个 phpmyadmin 上工作”。因此,只需执行 phpmyadmin 所做的 - 解析 SQL并将 LIMIT 部分添加到查询中。

于 2017-11-10T17:57:25.117 回答