3

我有一个 PHP 脚本,它调用一个可以轻松返回 6k+ 结果的 API 方法。

我使用 PEAR DB_DataObject 将 foreach 循环中的每一行写入数据库。

上面的脚本一次批处理 20 个用户——虽然有些人只会从 API 中得到一些结果,但其他人会得到更多。最坏的情况是所有人都有 1000 个结果。

调用 API 的循环似乎没问题,每 5 分钟 20 批工作正常。我唯一担心的是每个用户有 1000 个 mysql INSERTs(每个用户之间有很长的暂停以进行新的 API 调用)

有没有好的方法来做到这一点?还是我做得很好?!

4

7 回答 7

4

好吧,最快的方法是执行一个包含大量值的插入语句,如下所示:

INSERT INTO mytable (col1, col2) VALUES ( (?,?), (?,?), (?,?), ...)

但这可能需要放弃您现在使用的 DB_DataObject 方法。您只需权衡这样做的性能优势与使用 DB_DataObject 的“易用性”优势。

于 2009-04-02T17:40:25.073 回答
2

就像 Kalium 所说,检查瓶颈在哪里。如果它真的是数据库,您可以尝试一些 DBMS 提供的批量导入功能。

例如,在 DB2 中,它被称为 LOAD。它在没有 SQL 的情况下工作,但直接从命名管道读取。当您需要将大量新行带入数据库时​​,它的设计速度特别快。它可以配置为跳过检查和索引构建,使其更快。

于 2009-04-02T17:53:41.393 回答
1

那么,您的方法产生的负载是否超出您的处理能力?如果它有效,那么我认为没有任何理由立即更改它。

于 2009-04-02T17:36:07.863 回答
0

I have a few ideas, but you will have to verify them with testing.

If the table you are inserting to has indexes, try to make sure they are optimized for inserts.

Check out optimization options here: http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

Consider mysqli directly, or Pear::MDB2 or PDO. I understand that Pear::DB is fairly slow, though I don't use PEAR myself, so can't verify.

于 2009-04-02T18:03:35.067 回答
0

我认为几千条记录不会对您的数据库造成任何压力。甚至我的笔记本电脑也应该能很好地处理它。如果您不进行任何清理或分区,您最大的担忧可能是(来)巨大的表。避免对该部分进行过早优化。

至于您的方法,请确保您在单独的事务中处理每个用户(或批次)。如果是 mysql,请确保您使用的是 innodb 以避免不必要的锁定。如果您已经在使用支持事务的 innodb/postgres/其他数据库,您可能会看到性能显着提高。

考虑使用 COPY(至少在 postgres 上 - 不确定 mysql)。

确保您的表已正确索引(包括删除未使用的表)。索引会损害插入速度。

记得定期优化/清理。

于 2009-04-02T20:15:53.733 回答
0

数据库抽象层通常会增加相当多的开销。我发现,至少在 PHP 中,为了速度而使用普通的 mysql_query 比优化您选择的库要容易得多。

就像 Eric P 和 weinzierl.name 所说的那样,使用多行插入或 LOAD 将为您提供最佳的直接性能。

于 2009-04-02T17:55:38.970 回答
0

MySQL LOAD DATA INFILE功能可能是做你想做的最快的方法。

您可以查看MySQL 文档中 INSERT statements 的速度一章。

它谈到了很多改进 MySQL 中的 INSERTING 的方法。

于 2009-04-02T19:41:42.957 回答