С помощью следующего кода, хотя я получаю одну строку – весь набор данных загружается (что занимает несколько секунд):
$query = 'SELECT * FROM xxx WHERE id > :position ORDER BY id'; $stmt = $db->prepare($query); $stmt->execute([ ':position' => $position, ]); while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { break; }
Я попытался найти вариант в PDO, который заставил бы его извлекать строки по требованию (или разумными партиями), но не смог это сделать, по крайней мере, я не смог найти его в документации PDO.
Postgresql для данного запроса способен обслуживать первую строку в 0.28ms
в соответствии с EXPLAIN ANALYZE
.
И моя цель – как можно быстрее начать обработку строк, даже если последующие партии строк появятся с некоторыми сетевыми издержками.
Как я определил, что он извлекает все строки:
break
после первой строки или для итерации по всему набору данных tcpdump
и проверил, что он извлекает все строки. Таким образом, возникает вопрос: возможно ли сделать PDO
для выборки в строке за строкой (или в некоторых разумных небольших партиях) по требованию?
Я нашел ответ:
$stmt = $db->prepare($query, [\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL]);
Поэтому оператор должен быть создан с опцией \PDO::CURSOR_SCROLL
Рекомендации: