编写高效的代码。处理mysql表中的大量行

时间:2012-03-22 03:25:54

标签: php mysql

所以我正在处理的代码执行以下操作:

test.php的:

  1. 使用date_next<查询所有实体的mysql表(实体) NOW()和date_end> NOW()

  2. 计算新的date_next

  3. 检查此新date_next是否少于24小时
  4. 如果没有,则继续下一个实体
  5. 如果是这样,它会查询另一个名为“table2”的表并选择table2.entity_id = entities.id
  6. 的所有条目
  7. 它使用从table2获取的ID将批处理请求发送到第三方服务器。每次请求都会向第三方服务器发送500个ID。
  8. 我的问题是,如果实体表(#1)中有超过50,000个条目,我会收到错误“太多内存”。我猜我应该尝试限制#1的结果集。所以我想每次都在结果集上加上一个LIMIT。因此脚本test.php每天运行多次,每次限制来自#1的查询,每次只检索20,000个结果。但我不确定这是否是限制结果集的正确方法。

    对于#6,存在网络延迟。我尝试使用curl multi函数一次发送多个请求,但每个请求已经很大,因为对于每个请求,正在发送500个ID。我不太确定使用curl multi函数的优点是什么......

    我有没有考虑过使这项工作更有效率的方法? 我正在考虑以下事项: - 反向代理 - OS调整TCP数据包的数量 - 使用编译器缓存 - 增加PHP内存限制。不知道我应该设置什么其他配置。 - 多次运行test.php以限制结果集。每次只处理20,000或更少的记录。

1 个答案:

答案 0 :(得分:1)

查询步骤1 - 5

SELECT table2.entity_id FROM table2 
INNER JOIN (SELECT table1.id FROM table1 
WHERE table1.date_next < NOW() and table2.date_end > NOW() 
HAVING DATEDIFF(date_next_function(date_next), NOW()) > 1) as table3 
   ON table2.entity_id = table3.id 

我正在使用having子句使用date_next_function的计算过滤掉24小时之外的所有行