将一位数字划分为多个范围

时间:2019-02-14 09:23:19

标签: php math divide

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

我拥有大量的MySQL数据库记录集,并希望为脚本分配一些工作量。

示例:

表中有2435行,我希望每个PHP脚本仅选择特定范围的记录:

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

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

2 个答案:

答案 0 :(得分:0)

尝试这样-

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

对于第一个脚本,

LIMIT 150 OFFSET 0

然后使用第二个脚本

LIMIT 150 OFFSET 150

等等...

答案 1 :(得分:0)

所以,几天来,我一直在测试偏移量在海量数据集(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个CPU内核和32 GB RAM来补偿数据。使用LIMIT方法,我只需要4 GB RAM和2个CPU。因此,在大数据集中使用偏移量之前,请三思。