Как PHP PDO работает внутри страны?

Я хочу использовать pdo в своем приложении, но перед этим хочу понять, как внутри PDOStatement->fetch и PDOStatement->fetchAll.

Для моего приложения я хочу сделать что-то вроде "SELECT * FROM myTable" и вставить в файл csv, и он содержит около 90000 строк данных.

Мой вопрос: если я использую PDOStatement->fetch, поскольку я использую его здесь:

// First, prepare the statement, using placeholders
$query = "SELECT * FROM tableName";
$stmt = $this->connection->prepare($query);

// Execute the statement
$stmt->execute();
var_dump($stmt->fetch(PDO::FETCH_ASSOC));

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
{
echo "Hi";
// Export every row to a file
fputcsv($data, $row);
}

Будет ли после каждой выборки из базы данных результат для этой выборки будет храниться в памяти?

Значение, когда я делаю вторую выборку, в памяти будут данные первой выборки, а также данные для второй выборки.

Итак, если у меня есть 90000 строк данных, и если я делаю выборку каждый раз, когда память обновляется, чтобы получить новый результат выборки, не удаляя результаты предыдущей выборки, и поэтому для последней памяти выборки уже будет иметь 89999 строк данных.

  • Это как PDOStatement::fetch работает?
  • Производительность, как этот стек против PDOStatement::fetchAll?

Обновление: что-то о fetch и fetchAll из точки использования памяти

Просто хотел добавить кое-что к этому вопросу, так как недавно нашел что-то в отношении fetch и fetchAll, надеюсь, что это поставит вопрос в будущее, потому что люди будут посещать этот вопрос в будущем, чтобы получить некоторое представление о параметрах fetch и fetchAll.

fetch не хранит информацию в памяти, и она работает на основе строки на строку, поэтому она будет проходить через результирующий набор и возвращать строку 1, чем снова будет идти в результирующий набор, а затем снова возвращать строку 2, не будет возвращать строку 1, а также 2, но только вернет строку 2, поэтому выборка не будет хранить что-либо в памяти, но fetchAll будет хранить детали в памяти. Таким образом, выборка лучше по сравнению с fetchAll, если мы имеем дело с результирующим набором размером около 100 КБ.

Ответ 1

PHP обычно сохраняет свои результаты на сервере. Все зависит от водителя. MySQL можно использовать в "небуферизованном" режиме, но это довольно сложно использовать. fetchAll() на большом наборе результатов может вызвать наводнение сети, исчерпание памяти и т.д.

В каждом случае, когда мне нужно обработать более 1000 строк, я не использую PHP. Подумайте также, если в вашем ядре базы данных есть операция экспорта CSV. Многие делают.

Ответ 2

Я советую вам использовать PDO::FETCH_LAZY вместо PDO::FETCH_ASSOC для больших данных. Я использовал его для экспорта в csv по строкам, и он отлично работает. Без ошибок "из памяти".