将单个数字划分为范围

Divide single digit into ranges

我想不出 PHP 将数字划分为范围的方法。

我有大量 MySQL 数据库记录集,想为我的脚本分散一些工作量。

示例:

在table中有2435行,我希望每个PHP脚本select只有特定范围的记录:

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

主要问题:我想不出一种方法如何将 2435 分成偶数范围并将它们传递给 MySQL SELECT。

像这样尝试-

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

对于第一个脚本,

LIMIT 150 OFFSET 0

然后对于第二个脚本

LIMIT 150 OFFSET 150

等等...

因此,几天来我一直在测试偏移量在海量数据集(100+k 行)下的表现,结果很糟糕。 Offset 非常耗费资源,如果您的数据库中有大量行,则绝对不适合该任务。

我的最终代码如下所示(抽象):

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 CPU 个内核和 32 GB RAM。使用 LIMIT 方法,我只需要 4 GB RAM 和 2 CPU's。因此,在大型数据集中使用偏移量之前请三思。