我有一个调用API方法的PHP脚本,可以轻松返回6k +结果。
我使用PEAR DB_DataObject将foreach循环中的每一行写入DB。
上面的脚本是一次批处理20个用户 - 虽然有些人只会从API获得一些结果,但其他人会有更多。最糟糕的是,所有人都有1000的结果。
调用API的循环似乎没问题,每5分钟批量生成20个工作正常。我唯一担心的是每个用户1000个mysql INSERT(每个用户之间有一个很长的停顿时间用于新的API调用)
这样做有好办法吗?或者我做得好吗?!
答案 0 :(得分:4)
嗯,最快的方法是执行一个带有大量值的insert语句,如下所示:
INSERT INTO mytable (col1, col2) VALUES ( (?,?), (?,?), (?,?), ...)
但是这可能需要放弃你现在使用的DB_DataObject方法。您只需权衡以这种方式执行的性能优势与使用DB_DataObject的“易用性”优势。
答案 1 :(得分:2)
像Kalium所说,检查瓶颈在哪里。 如果它确实是数据库,您可以尝试一些DBMS提供的批量导入功能。
例如,在DB2中,它被称为LOAD。 它在没有SQL的情况下工作,但直接从命名管道读取。 当您需要携带大量新行时,它特别设计为快速 进入数据库。 它可以配置为跳过检查和索引构建,使其更快。
答案 2 :(得分:1)
那么,你的方法产生的负载是否超出了你的能力?如果它正在工作,那么我认为没有任何理由随意改变它。
答案 3 :(得分:0)
数据库抽象层通常会增加相当大的开销。我发现,至少在PHP中,为了速度而使用普通的mysql_query比优化你选择的库要容易得多。
就像Eric P和weinzierl.name所说,使用多行插入或LOAD将为您提供最佳的直接性能。
答案 4 :(得分:0)
我有一些想法,但您必须通过测试验证它们。
如果要插入的表具有索引,请尝试确保它们针对插入进行了优化。
在此处查看优化选项: http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html
直接考虑mysqli,或者Pear :: MDB2或PDO。我知道Pear :: DB相当慢,虽然我自己不使用PEAR,所以无法验证。
答案 5 :(得分:0)
MySQL LOAD DATA INFILE 功能可能是您想要的最快方式。
您可以查看MySQL文档中的Speed of INSERT statements章节。
它讨论了很多改进MySQL中INSERTING的方法。
答案 6 :(得分:0)
我认为几千条记录不会给你的数据库带来任何压力;甚至我的笔记本电脑应该很好地处理它。如果您不进行任何清理或分区,那么您最大的担心可能是(来)巨大的表。避免在那部分过早优化。
至于您的方法,请确保您在单独的事务中执行每个用户(或批处理)。如果是mysql,请确保使用innodb以避免不必要的锁定。如果您已经在使用innodb / postgres /支持事务的其他数据库,那么您可能会看到显着的性能提升。
考虑使用COPY(至少在postgres上 - 不确定mysql)。
确保您的表格已正确编入索引(包括删除未使用的表格)。索引会影响插入速度。
请记住定期优化/吸尘。