慢查询 - GAE PHP和Cloud SQL

时间:2015-02-10 02:29:10

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

我有一个计划应用程序,允许用户使用每周模板批量创建事件。这可以通过AJAX将模板课程发布到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实例的层。它对所花费的时间没有任何影响。

1 个答案:

答案 0 :(得分:1)

需要考虑的一些建议:

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

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

  3. 通过查看您的代码(我对PHP / mysql不是很熟悉),在创建800个事件时,您还可以单独联系数据库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);