将单个数字划分为范围
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。因此,在大型数据集中使用偏移量之前请三思。
我想不出 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。因此,在大型数据集中使用偏移量之前请三思。