我无法用PHP的方式将数字划分为范围。
我有大量的MySQL数据库记录集,并希望为我的脚本传播一些工作量。
例:
表中有2435行,我希望每个PHP脚本只选择特定的记录范围:
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行)的行为,这很糟糕。如果数据库中有大量行,则偏移是非常耗费资源的,并且绝对不适合该任务。
我的最终代码看起来像这样(抽象):
通过选择。
// 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数据集中使用偏移量之前要三思而后行。