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).

1 ответ

То, что вы пытаетесь сделать, называется варварством.
И проблема не в том, чтобы отбросить результаты запроса.

С точки зрения непрофессионала, ваш вопрос очень похож на:

Мне нужен был костер, чтобы сварить себе чашку чая. Вырубить несколько стволов - слишком много работы; У меня была тонна динамита, поэтому я просто взорвал весь лес. Это сработало, мой костер был идеальным. Но теперь мне не нужен весь этот мусор, валяющийся вокруг. Как я могу заставить его исчезнуть в клубе дыма?

И главная проблема здесь - это лес, которого больше нет.

С вашими идеями вы поступаете точно так же. Вы тратите впустую МНОГО ресурсов, как на стороне PHP, так и на стороне MySQL, в результате чего сервер MySQL загружает много данных, когда вам нужно всего несколько строк. И даже время, необходимое для очистки набора результатов, не намекает вам на то, что вы делаете что-то не так.

Хорошо, вы найдете этот волшебный способ отбросить несколько гигабайт данных в секунду. Но эти гигабайты должны быть собраны в первую очередь. И когда ваш самодельный phpmyadmin убьет сервер базы данных, его пользователи будут не так благодарны, как вы ожидаете.

В удаленном комментарии вы указали, что "работаете над другим phpmyadmin". Просто сделайте то, что делает phpmyadmin - проанализируйте SQL и добавьте часть LIMIT к запросу.

Другие вопросы по тегам