通过远程连接到DB的Mysql查询

时间:2016-04-26 19:40:16

标签: php mysql vagrant

对于开发,我在我的内部网络上使用带有远程MySQL数据库的vagrant,如果我是外部的,我用vpn连接到它。

我有一个执行~2000个查询的进程。当我使用vpn进行此过程时,单个查询可能需要大约0.3秒才能运行,这意味着如果ajax调用没有先崩溃,整个过程将需要10分钟。

在生产服务器上运行此操作只需不到10秒。

这个问题分为两部分。

  1. 我可以优化vagrant和远程数据库之间的连接,以便每个查询更快。
  2. 和/或

    1. 我可以优化流程以减少查询次数吗?
    2. 对于问题2,该过程涉及将记录插入到邮件表中,然后更新循环内另一个表中的记录,这样这两个查询每次发生大约1000次。我正在准备循环之外的语句并在内部执行。我已经尝试使用关闭自动提交的事务。

      //Insert query
      INSERT INTO emails
      (
           email,
           subject,
           html
      )
      VALUES
      (
           :email,
           :title,
           :html_message
      )
      
      //Update query
      UPDATE
          details
      SET
          email_sent_date = :sent_date,
          unique_val = :val
      WHERE
          id = :id
      

1 个答案:

答案 0 :(得分:1)

尝试将它们组合成单个查询,而不是在循环中执行单独的查询。对于INSERT,您可以使用多个值列表:

INSERT INTO emails (email, subject, html)
VALUES (:email1, :subject1, :html1), (:email2, :subject2, :html2), ...

对于UPDATE,您可以使用条件分配。

UPDATE details
SET email_sent = CASE id
    WHEN :id1 THEN :sent_date1
    WHEN :id2 THEN :sent_date2
    ...
END,
    unique_val = CASE id
    WHEN :id1 THEN :val1
    WHEN :id2 THEN :val2
    ...
END
WHERE id IN (:id1, :id2, ...)

您应该能够从输入数据动态生成这些查询和关联参数数组。