Разделите одну цифру на диапазоны - PullRequest
0 голосов
/ 14 февраля 2019

Я не могу придумать в PHP способ разделить число на диапазоны.

У меня установлен массив записей базы данных MySQL и я хочу распределить некоторую рабочую нагрузку для моих сценариев.

Пример:

В таблице 2435 строк, я хочу, чтобы каждый скрипт PHP выбирал только определенный диапазон записей:

Script 1: select [1 to 150];
Script 2: select [151 to 270];

Основная проблема: я не могу придумать способ, как разделить эти 2435в четные диапазоны и передать их в MySQL SELECT.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Итак, в течение нескольких дней я тестировал, как смещение ведет себя с массивными наборами данных (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.

0 голосов
/ 14 февраля 2019

Попробуйте вот так -

SELECT * FROM table_name ORDER BY id ASC LIMIT 150 OFFSET 0

Для 1-го сценария

LIMIT 150 OFFSET 0

, затем Для 2-го сценария

LIMIT 150 OFFSET 150

И так далее ...

...