【问题标题】:Unusable app due to extremely slow queries由于查询速度极慢而无法使用的应用程序
【发布时间】:2016-03-09 18:05:18
【问题描述】:

我在 Laravel 上的数据库查询遇到了一个奇怪的问题。

我已经使用查询生成器实现了一个动态查询,使用获取参数。

我注意到某些查询非常慢,因此我开始调试从查询生成器生成的 sql,并使用 DB::select( $sql ) 使用原始 sql 语句执行查询。

我做了一些研究,我知道 n+1 问题,但事实并非如此,因为为了调试,我只是使用了带有 DB::select( $sql ) 的控制器操作,但它没有t 显示任何结果。它向我展示了:

代理错误

代理服务器收到来自上游服务器的无效响应。 代理服务器无法处理请求 GET /controller/action。

原因:从远程服务器读取错误

同样的查询,带有不需要大量数据库处理的参数,使用这种方法运行良好...

当我在 MySQL Workbench 上运行有问题的查询时,它们需要 5 到 10 秒才能显示结果。

在我的进一步调试中,我在操作中手动创建了一个 PDO 对象并执行了查询。令我惊讶的是,它的运行时间与 Workbench 相同。我在查询结果上使用了 hydrate 方法,对象在视图上渲染成功。

接下来,我尝试使用 Laravel 的 PDO 对象执行查询,并使用 DB::getPdo() 获取它。查询未处理,再次导致代理错误...

使用自定义 PDO 对象解决了这个问题,但我不喜欢创建 PDO 对象的想法,而不是使用 Laravel 的。

我不明白为什么会这样。它可以与数据库配置或 Laravel 的 PDO 对象相关吗?任何帮助表示赞赏!

【问题讨论】:

  • 抛出代理错误需要多长时间,是运行查询通常需要 5-10 秒还是 30+ 秒?
  • 大约需要 30+ 秒
  • 那么可能是超时问题,因为脚本的默认 PHP max_execution_time 设置是 30 秒。 Laravel 的查询构建器在其内部使用的 PDO 之上引入了一些额外的复杂性,并且您的查询复杂性可能会产生过多的开销。您的查询似乎是问题的起点,所以我不知道是否有人可以在没有看到您实际尝试做什么的情况下提供相关建议。

标签: php laravel pdo


【解决方案1】:

有时这类问题与慢速或糟糕构建的查询并不完全相关,而是与未正确管理 MySQL 设置有关。

MySql 默认设置是通用的。那里有很多可以调整和微调的地方,以显着提高性能。查询缓存、缓冲区、内存使用等。可以做的事情很多。

查看这篇文章:http://www.tecmint.com/mysql-mariadb-performance-tuning-and-optimization/

也有用于此目的的特定工具。有些有很好的 GUI,但我最喜欢的是基于命令行的,比如 MyTop 和 MySQLTunner https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多