@ptvalx

Почему while ($row = $db_data->fetch_assoc()) сжирает память с большими таблицами?

Таблица размером: 1 гб.
Лимит памяти PHP: 1 гб.
Записей в таблице: 100000.

Выполняю
$db = new mysqli(null, 'root', '', 'db_name');
$db_data = $db->query("SELECT * FROM table_name");

while ($row = $db_data->fetch_assoc()) {}


Получаю
Allowed memory size of 1073741824 bytes exhausted (tried to allocate 16384 bytes)


Я же не выбираю все записи разом (fetch_all), а беру по одной. Почему так происходит? Как исправить?

upd: выяснилось, что даже без fetch_assoc память кончается, и select происходит медленно. Думаю, попробовать делать select порционно, с LIMIT
  • Вопрос задан
  • 263 просмотра
Решения вопроса 1
@ptvalx Автор вопроса
Помогло:

$db = new mysqli(null, 'root', '', 'db_name');
$db->real_query("SELECT * FROM table_name");
$db_data = $db->use_result();
while ($row = $db_data->fetch_assoc()) {}


Но, нельзя с того-же подключения к бд выполнять другие запросы внутри цикла. У меня в коде был INSERT в другую таблицу. С ним не работало
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
qant
@qant
programer
Предполагаю что в эту таблицу свалено вообще ВСЕ...

Как вариант: разделить запрос на несколько простых

Основную выборку сделайте указав обязательные поля например только id и type что бы выбрать нужные вам значения:

select id,type from table where type='active', я думаю результату оч сложно будет скушать много памяти.

Далее в цикле где уже будете выводить данные, добираете остальные нужные данные

select title, content from table where id=1;

Надеюсь идея понятна.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
7skills Ижевск
от 120 000 до 150 000 ₽
от 140 000 до 170 000 ₽
08 мар. 2021, в 13:49
2000 руб./в час
08 мар. 2021, в 13:46
800 руб./в час
08 мар. 2021, в 13:42
1000 руб./в час