0

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

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

因此对于,

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

我的问题是,

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

  • 如何管理这种类型的数据库操作?
  • 如何将我的数据库操作拆分为两个部分/线程,以便每个部分/线程并行运行,这样我就可以将时间减少一半。这是我主要关心的问题。
  • 对于这种情况,您有什么建议?
4

2 回答 2

2

很可能,数据库时间不是您的问题。即使每次使用新的(未准备好的)语句,14k 记录也不应该是几个小时的问题(假设存在用于查找的索引)。

(当然你也应该确认(测量)数据库运行时间,当然你应该使用准备好的语句。)

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

作为最后的优化,您可以生成一组工作进程(或线程),以并行处理您从数据库中获取的行。

于 2013-11-09T22:05:16.473 回答
1
  • 在您的数据库客户端创建相当多的线程/子进程,比如 20 或 50 个,以并行更新不同的记录部分;监控客户端和服务器上的 CPU、IO、内存,查看使用了多少资源,如果可以,增加数量。
  • 在您的数据库客户端批量提交;比如说,每更新 100 行后才提交;
  • 确保键列在数据库服务器端被索引;
  • 处理大量数据记录时,请始终考虑批处理。这适用于数据库操作、Web 服务、休息等。
  • 不确定您的业务逻辑,您可能希望 Web 服务读取和数据库更新也并行运行。换句话说,当一些线程正在获取一些外部数据时,其他线程正在将数据写入数据库。
  • 是的,如果重复执行一条sql语句,使用prepared statements要好得多。
  • 您还可以考虑在整个过程中禁用数据引用完整性等功能,或者在发出提交命令时将数据库设置为强制执行。结合批量提交,这在db服务器端节省了大量时间。
于 2013-11-09T22:20:37.980 回答