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 к запросу.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]