【问题标题】:Slow Queries - GAE PHP and Cloud SQL慢查询 - GAE PHP 和 Cloud SQL
【发布时间】:2015-02-10 02:29:10
【问题描述】:

我有一个日程安排应用程序,允许用户使用每周模板批量创建活动。这通过将模板课程通过AJAX 发布到PHP file 来实现,该PHP file 采用模板并将其复制所需的次数。它一次必须创建的事件数量可能在 200-800 之间,具体取决于。

我遇到的问题是这些查询需要很长时间才能完成,这会导致网站挂起,有时在等待所有条目完成时会超时。

一个简化的例子:

$events = array('valid array of all events and their details');
foreach($events as $event) {
      $query = 'Valid SQL with individual event detaisl';
      mysqli_query($connection, $query);
}

实际上会进行更多操作,例如,计算开始时间和结束时间,将用户与 junction tables 关联等。这必须运行 200-800 次才能为模板生成的每个单独事件创建一个条目.

我将如何加快速度?

非常感谢任何见解!

更新:我已经尝试增加 SQL 实例的层级。它对花费的时间没有任何影响。

【问题讨论】:

  • 你能把这项工作卸载到任务队列吗?用户是否需要在响应中看到这些操作的结果?
  • 我猜它可以被卸载。他们的想法是选择一个时间范围并单击“导出”。然后它会启动并使用模板在日历上创建事件并将用户重定向到日历以便他们可以看到它们。
  • Guy,正如 Stuart 指出的那样,一种选择是将写入委托给任务。当您使用 AJAX 时,您可以稍后异步更新状态。另一个建议是在 Cloud SQL 实例的设置中将您的实例配置为与您的应用程序位于同一位置。第三个是优化 SQL 语句,使所需锁的数量接近最低限度。

标签: php mysql google-app-engine google-cloud-sql


【解决方案1】:

需要考虑的一些建议:

  1. 每个请求创建 200-800 个新数据库条目听起来有点过分。您的应用程序的逻辑和您使用的数据模型/结构可能会得到显着改进和优化如果需要,如果将来添加或更改任何自定义(不是来自模板)信息,请单独保存。这可能需要对您的代码进行大量更改,并且可能值得也可能不值得(时间方面而不是速度方面,这肯定会有所改善)。

  2. 正如在 cmets 中已经提到的,这可以被纳入一个单独的任务,向用户提供一些 UI 反馈,说正在创建事件,然后另一个通知说它现在已经完成。

  3. 通过查看您的代码,在创建 800 个事件时(我对 PHP/mysql 不是很熟悉),您还分别联系了数据库 800 次(每次都在等待完成响应)。假设瓶颈出现在这些多重连接中,那么通过连接生成的查询并将它们一次性提供给数据库,您可能会获得一些性能改进。请参阅下面的示例(注意每个生成的查询末尾的必需分号和允许一次发送多个查询的mysqli_multi_query 函数):

    $events = array('valid array of all events and their details'); $query = ""; foreach($events as $event) { $query .= 'Valid SQL with individual event detaisl;\n'; } mysqli_multi_query($connection, $query);

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多