Я передаю произвольный 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 загружает много данных, когда вам нужно всего несколько строк. И даже время, необходимое для очистки набора результатов, не намекает вам на то, что вы делаете что-то не так.
Хорошо, вы найдете этот волшебный способ отбросить несколько гигабайт данных в секунду. Но эти гигабайты должны быть собраны в первую очередь. И когда ваш самодельный phpmyadmin убьет сервер базы данных, его пользователи будут не так благодарны, как вы ожидаете.
В удаленном комментарии вы указали, что «работаете над другим phpmyadmin». Так что просто делайте то, что делает phpmyadmin — разбирайте SQL и добавить часть LIMIT к запросу.
Других решений пока нет …