Итак, в течение нескольких дней я тестировал, как смещение ведет себя с массивными наборами данных (100 + k строк), и это было ужасно.Смещение безумно ресурсоемко и определенно не для задачи, если у вас есть большое количество строк в вашей базе данных.
Мой окончательный код выглядит следующим образом (абстракция):
chunker.php
// Divide table rows into 50 chunks and produce array
$rows = DB::query("SELECT id FROM data_set GROUP BY id DESC");
$chunks = array_chunk($rows, 50, TRUE);
// Extract endings of each chunk array
$ends = array();
foreach ($chunks as $c) {
$f = flattenArray($c);
$arr_end = end($f);
array_push($ends, $arr_end);
}
// Spawn separate PHP processes to work with a chunk array ending
foreach ($ends as $e) {
$bb = shell_exec("php -q worker.php '".$e."' > /dev/null &");
}
worker.php
// Catch argv
$exec_args = $_SERVER['argv'];
// Select predefined amount of rows from DB which is more than or equal to argv value
$data = DB::query("SELECT * FROM data_set WHERE id >= %i LIMIT 50", $exec_args[1]);
foreach ($data as $d) {
// Do you stuff here
}
Эта адаптация пришла отэта статья http://mysql.rjweb.org/doc.php/pagination
Для повышения производительности Для обработки данных требуется 8 ядер ЦП с 32 ГБ ОЗУ.С методом LIMIT мне нужно только 4 ГБ оперативной памяти и 2 процессора.Итак, подумайте дважды, прежде чем использовать смещение в наборах данных LARGE.