INSERT 6000行 - 最佳实践

时间:2009-04-02 17:34:01

标签: php mysql api insert

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

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

上面的脚本是一次批处理20个用户 - 虽然有些人只会从API获得一些结果,但其他人会有更多。最糟糕的是,所有人都有1000的结果。

调用API的循环似乎没问题,每5分钟批量生成20个工作正常。我唯一担心的是每个用户1000个mysql INSERT(每个用户之间有一个很长的停顿时间用于新的API调用)

这样做有好办法吗?或者我做得好吗?!

7 个答案:

答案 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)。

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

请记住定期优化/吸尘。