长数据操作的最佳方法?

时间:2013-11-09 21:30:11

标签: php mysql sql multithreading batch-processing

我有一个脚本可以执行以下操作..

  • 从db
  • 获取一条记录
  • 调用外部api(来自互联网上的其他人)并获取数据
  • 它读取数据更新的sql数据库(几乎相同的记录,包含几列的更新值)

所以,

  • 我没有使用*,而只是查询所需的列
  • 我在非高峰时段运行脚本
  • 我的环境是在当前版本的WAMP上运行的LocalHost
  • 我有一台服务器机器,没关系,没问题

我的问题是,

我有一个包含超过14k记录的大数据库,需要每天更新(有些产品我需要更新成本和数量)。当脚本运行时,它运行几个小时,然后它也永远不会完成14k记录,而是停止在大约8k记录更新...

  • 如何管理此类数据库操作?
  • 如何将我的数据库操作拆分为两个部分/线程,以便每个部分/线程与其他部分/线程并行运行,这样,我就可以将时间减少一半。这是我的主要关注点。
  • 您对此类情况有何建议?

2 个答案:

答案 0 :(得分:2)

最有可能的是,DB时间不是你的问题。即使每次使用新的(未准备的)语句,14k记录也不应该是几小时(假设存在查找索引)。

(但是当然你也应该确认(测量)db运行时间,当然你应该使用预备语句。)

然而,调用外部Web服务14k次显然需要相当长的时间!外部服务是否提供批处理API?如果没有,我建议您在查询服务器以获取进一步请求时尝试保持HTTP连接打开(活动),以减少网络延迟。

作为最后一次优化,您可以生成一组工作进程(或线程),用于处理从DB同时获取的行。

答案 1 :(得分:1)

  • 在数据库中创建相当多的线程/子进程,比如说20或50 客户端并行更新记录的不同部分; 监控客户端和服务器上的CPU,IO,内存,看看有多少 资源被利用,如果罚款,增加数量。
  • 您的数据库客户端批量提交;比如说,只有在每100行更新后才提交;
  • 确保在数据库服务器端索引关键列;
  • 在处理大量数据记录时,始终要考虑批处理。这适用于数据库操作,Web服务,休息等。
  • 不确定您的业务逻辑,您可能希望同时进行Web服务读取和数据库更新。换句话说,虽然某些线程正在获取某些外部线程,但其他线程正在将数据写入db。
  • 是的,如果重复执行一个sql语句,那么使用预准备语句要好得多。
  • 您还可以考虑在整个过程中禁用数据引用完整性等事项,或者在发出提交命令时设置db强制执行它。结合批量提交,这可以节省数据库服务器端的大量时间。