Необработанный SQL-запрос со множеством объединений, выборок и прочего при загрузке
Код: Выделить всё
$results = DB::SELECT($query)
Решение
Поэтому вместо этого $query теперь создает временную таблицу, которая считывается следующим образом:
Код: Выделить всё
$new_rows = true;
$chunk = 25000;
$offset = 0;
while ($new_rows) {
$chunked_results = DB::SELECT('SELECT * FROM tmp_table ORDER BY id DESC LIMIT ' . $chunk . ' OFFSET ' . $offset );
if (count($chunked_results) === 0) {
$new_rows = false;
}
foreach ($chunked_results as $row) {
//Do stuff with $row
}
$offset+= $chunk;
unset($chunked_results);
}
Несмотря на снятие настроек $chunked_results после каждого запроса, моему скрипту по-прежнему не хватает памяти в районе 75-тысячного ряда - почти тоже самое нет. строк, которые были загружены без фрагментации/tmp_table.
Это заставляет меня поверить, что каким-то образом содержимое предыдущих $chunked_results сохраняется в памяти и на самом деле не сбрасывается, или DB::class запоминает данные в фоновом режиме.
Выполнение DB::RECONNECT('mysql') уничтожает временную таблицу
Подробнее здесь: https://stackoverflow.com/questions/791 ... ting-query
Мобильная версия