2016-03-10 7 views
0

Я пытаюсь выполнить итерацию по двум таблицам и вытащить записи. В таблицах есть сотни тысяч строк, поэтому я знаю, что вытаскивать их все сразу не сработает, поэтому цикл и вытягивание их в партиях кажется лучшим подходом, но он не освобождает память, поэтому после нескольких попыток заканчивается память и сбои.MySQL заканчивается из памяти после нескольких запросов

Мой выход

 

    400000 Pulled, currently on 0 || Out of 1623230 
    400000 Pulled, currently on 400000 || Out of 1623230 

    Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 39 bytes) in C:\xampp\htdocs\misc\manage tickets\test2.php on line 38 

Игнорировать номер строки, у меня есть гигантский блок закомментированного кода в верхней части файла.

Код:

$iterate = 400000; 


$query = "SELECT id FROM $old_db.ticketaudit_archive"; 
$get = $g_mysqli->query($query); 
$count = $get->num_rows; 

$i = 0; 
while($i <= $count){ 
    $query = "SELECT * FROM $old_db.ticketaudit_archive LIMIT $i, $iterate"; 
    $get = $g_mysqli->query($query); 
    echo $get->num_rows.' Pulled, currently on '.$i.' || Out of '.$count.'<br>'; 
    while($z = $get->fetch_assoc()){ 
     $old_ticket_id = $z[old_ticket_id]; 
     $ticket_id = $z[ticket_id]; 
     unset($z[old_ticket_id], $z[ticket_id], $z[id]); 
     if($old_ticket_id != ''){ 
      $ticketaudit[old_ticket_id][$old_ticket_id][] = $z; 
      $xx += 1; 
     } 
     elseif($ticket_id != ''){ 
      $ticketaudit[ticket_id][$ticket_id][] = $z; 
      $xx += 1; 
     } 
    } 
    $i += $iterate; 
    $get->free(); 
    $get->free_result(); 
    $get->close(); 
} 

Я был в этом весь день, и не может найти способ, чтобы получить MySQL уронить чертову кэш-памяти для предыдущих запросов.

+0

Это не MySQL работает из памяти, это PHP. Это важное различие. –

+0

Вы извлекаете данные из 400 000 строк, если у вас много данных, тогда вы, вероятно, столкнетесь с проблемами памяти. – Matt

+0

$ i и количество строк могут не увеличиваться отлично, если вы удалили строки, ваши номера не совпадут. Вероятно, вы должны использовать «foreach», а не инкрементную схему. –

ответ

0

Я думаю, что вы можете искать небуферных запросы:

Unbuffered запросов MySQL выполнить запрос, а затем возвращает ресурс в то время как данные все еще ждет на сервере MySQL для того неправдоподобным. Это использует меньше памяти на стороне PHP, но может увеличить нагрузку на сервер. Если полный набор результатов не был получен с сервера, никакие дальнейшие запросы не могут быть отправлены по одному и тому же соединению. Небуферизованные запросы также можно назвать «результатом использования».

Вот небуферизован пример запроса:

$get = $g_mysqli->query($query, MYSQLI_USE_RESULT);

Вы можете прочитать больше here

+0

Это на самом деле похоже на трюк. Благодарю. – Lilbnyfufu

+0

Удивительный, рад, что это помогло! Вы можете принять ответ :) – avip

Смежные вопросы