执行多个插入,更新,以“;”分隔的查询立刻!

时间:2010-10-27 19:31:16

标签: php mysql pdo

我使用远程服务器将值存储到MySQL数据库中。

我不使用任何SELECT查询,只使用INSERT,DELETE和UPDATE。

当我执行70,000个查询时,我遇到速度问题。

我正在尝试mysql_unbuffered_query并且我看到了很少的表现利润,但它仍然太慢了。

我记得PHP中的一些函数允许我执行多行,由;

分隔
$something=<<<something

query1 ;
query2 ;
query3 ;

something;

execute($something)

有人可以帮我记住吗?

也许在PDO中?

6 个答案:

答案 0 :(得分:3)

您正在考虑的功能是PHP heredoc语法。它允许您使用<<<执行多个行字符串。

但是PDO不支持多个SQL语句。您需要拆分它们并单独执行每一个。你说这对你来说太慢了,所以你可能无法使用PDO。

如果您有许多相同但具有不同参数的语句,则可以使用PDO预处理语句。有了这些,你可以准备一次语句,然后用不同的参数执行它。如果您有多种类型的陈述,则需要单独准备每种陈述。您可以阅读有关准备好的陈述here的更多信息。它们还具有不易受SQL注入攻击的好处。

答案 1 :(得分:2)

您需要mysqli.multi-query。只需创建SQL命令(例如,就像使用heredoc语法一样)并执行它。确保正确配置了分隔符。

答案 2 :(得分:0)

如果您不想等待,INSERT DELAYED和表兄弟,仍有单独的查询,是可行的方法。如果您不能使用它们(例如,您正在使用InnoDB存储引擎),则必须将它们提供给另一个可以/允许等待它们的进程。

对于后一个选项,我特别喜欢gearman的作业/工作者/客户端概念,虽然需要一些工作来让一群非网络服务器相关的工作人员运行它是一个天赐之物,当你只是想要告知用户您将完成所请求的更改,可能在完成时进行回调,但实质上是让用户以他/她的快乐方式进行。

答案 3 :(得分:0)

如果您从一些较慢的查询中发布了代码,也许我们可以帮助调整它们。很多时候,你错过了一些东西只是因为你已经看了很长时间的代码。

答案 4 :(得分:0)

为什么不一次拨打所有语句,用分号分隔?

mysql_query("
    INSERT INTO something (some, thing) VALUES (123, 456);
    UPDATE AT something STATEMENTS;
    THIRD QUERY; 
    FOURTH MYSQL QUERY; 
    AND SO ON;
");

答案 5 :(得分:0)

可能更好地进行批量操作并将它们包装在事务中(取决于场景)......

对于插页: How to do a batch insert in MySQL

有关更新: https://dba.stackexchange.com/questions/119621/how-to-update-10-million-rows-in-mysql-single-table-as-fast-as-possible

删除: Deleting millions of rows in MySQL