将单个数字除以范围

问题描述 投票:0回答:2

我无法用PHP的方式将数字划分为范围。

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

例:

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

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

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

php math divide
2个回答
0
投票

尝试这样 -

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

对于第一个脚本,

LIMIT 150 OFFSET 0

然后是第二个脚本

LIMIT 150 OFFSET 150

所以......


0
投票

因此,几天后我一直在测试偏移对大量数据集(100 + k行)的行为,这很糟糕。如果数据库中有大量行,则偏移是非常耗费资源的,并且绝对不适合该任务。

我的最终代码看起来像这样(抽象):

通过选择。

// 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。因此,在LARGE数据集中使用偏移量之前要三思而后行。

© www.soinside.com 2019 - 2024. All rights reserved.