@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
  • Вопрос задан
  • 311 просмотров
Решения вопроса 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
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Комментировать
qant
@qant
programer
Предполагаю что в эту таблицу свалено вообще ВСЕ...

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

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

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

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

select title, content from table where id=1;

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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽