У меня странное время, когда вы выбираете из таблицы около 30 000 строк.
Кажется, что мой script использует возмутительное количество памяти для простой, передовой только для обработки результата запроса.
Обратите внимание, что этот пример - несколько придуманный, абсолютный минимальный пример, который очень мало похож на реальный код и не может быть заменен простой агрегацией базы данных. Он предназначен для иллюстрации того, что каждая строка не должна сохраняться на каждой итерации.
<?php
$pdo = new PDO('mysql:host=127.0.0.1', 'foo', 'bar', array(
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
));
$stmt = $pdo->prepare('SELECT * FROM round');
$stmt->execute();
function do_stuff($row) {}
$c = 0;
while ($row = $stmt->fetch()) {
// do something with the object that doesn't involve keeping
// it around and can't be done in SQL
do_stuff($row);
$row = null;
++$c;
}
var_dump($c);
var_dump(memory_get_usage());
var_dump(memory_get_peak_usage());
Выводится:
int(39508)
int(43005064)
int(43018120)
Я не понимаю, почему используется 40 мегабайт памяти, когда вряд ли какие-либо данные должны храниться в любой момент времени. Я уже разработал, что могу уменьшить память примерно в 6 раз, заменив "SELECT *" на "SELECT home, away", однако я считаю, что даже это использование будет безумно высоким, и таблица только увеличится.
Есть ли параметр, который мне не хватает, или есть некоторые ограничения в PDO, о которых я должен знать? Я рад избавиться от PDO в пользу mysqli, если он не может это поддерживать, поэтому, если это единственный вариант, как я могу выполнить это с помощью mysqli?