我正在编写一个PHP Cron脚本,它将从论坛部分获取所有线程并迭代以查看它们是否符合某些条件(例如,如果它们超过2年)。
通常我会这样做:
SELECT DATE_CREATED FROM `threads`
WHERE BOARD = board_id
AND (YEAR(NOW()) - YEAR(DATE_CREATED)) >= 2
然后相应地循环。
现在有可能有1,000,000或更多线程符合此标准。
最初,我认为不需要限制返回的行,因为它是一个Cron脚本
现在我认为当返回的行变得非常大时,可能会出现一些内存问题。
这是我需要帮助来解决如何在将由Cron作业执行的PHP脚本中有效循环数千条MySQL记录的问题。
我曾考虑使用LIMIT然后将其作为分页内容进行迭代,但我想知道是否有更有效的方法来执行此操作;希望只在MySQL服务器上。
提前致谢。
答案 0 :(得分:0)
1-第一个解决方案 - 使用限制和偏移将类似于(伪代码):
//get total number of rows
$total_rows = $db->$query("SELECT COUNT(*) FROM `threads`
WHERE BOARD = board_id
AND (YEAR(NOW()) - YEAR(DATE_CREATED)) >= 2");
//put in your array or wherever you need 1000 rows at a time
for($i = 0; $i < $total_rows/1000; i++){
$array << $db->query("SELECT DATE_CREATED FROM `threads`
WHERE BOARD = board_id
AND (YEAR(NOW()) - YEAR(DATE_CREATED)) >= 2
LIMIT ($i+1, $i+1)*1000");
}
2 - 解决方案:逐月获取行数,考虑到你只有两年(比如2016-2017),为了简单起见你可以做类似的事情
$base_year = 2016;
//nest loops for the years and for the months
for($i = 0; $i < 2; $i++){
for($j = 0; j < 12; $j++){
$array << $db->query("SELECT DATE_CREATED FROM `threads`
WHERE BOARD = board_id
AND YEAR(DATE_CREATED) = ($i + $base_year)
AND MONTH(DATE_CREATED = ($j+1)");
}
}
希望这有助于您找到合适且更合适的方式。