一次执行多个用分号分隔的插入、更新查询!

3

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

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

当我执行70,000个查询时,速度会变慢。

我尝试了mysql_unbuffered_query,并看到了一些性能提升,但仍然太慢了。

我记得PHP中的一些函数允许我执行几行代码,用分号分隔。

$something=<<<something

query1 ;
query2 ;
query3 ;

something;

execute($something)

有人能帮我记住吗?

也许是在PDO中?

6个回答

3
你想要的功能是PHP heredoc语法,它允许您使用<<<进行多行字符串。但是PDO不支持一次执行多个SQL语句,您需要将它们分开并逐个执行。您说这对您来说太慢了,所以您可能无法使用PDO。如果您有许多相同但具有不同参数的语句,可以使用PDO准备语句。使用它们,您可以先准备语句,然后仅使用不同的参数执行它。如果您有多种类型的语句,则需要单独准备每个语句。您可以在此处阅读有关准备语句的更多信息。它们还具有不易受到SQL注入攻击的好处。

你没有正确理解我的意思。我执行这些查询没有问题。但是当我发送查询时,必须等待它完成。在使用本地服务器时效果很好,但是在使用远程服务器时......需要很长时间。70,000个查询大约需要一个小时才能完成......这就是为什么我想在一个请求中发送大约100个查询......这将使操作更快。 - marc

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

mysqli是否预装在大多数共享主机上? 我正在编写需要与php4和php5向后兼容的应用程序 :/ - marc

0

为什么不直接用分号将所有语句一次性调用呢?

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

0

如果您不想等待,INSERT DELAYED 和其它类似的方法,仍然需要单独查询,这是一种可行的方式。如果您不能使用它们(例如,您正在使用InnoDB存储引擎),那么您将不得不将它们提供给另一个可以/允许等待它们的进程。

对于后一种选择,我特别喜欢 gearman 的工作/工人/客户端概念,尽管需要一些工作来运行一组与Web服务器无关的工作程序,但当您只想通知用户您将执行所请求的更改时,它是非常有用的,可能会在完成时回调,但基本上让用户继续他/她的工作。


0
如果你把一些较慢查询的代码贴出来,也许我们可以帮你进行调优。往往因为长时间盯着代码看,你可能会错过一些细节。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接