【问题标题】:Simple query slow in Laravel, but insanely fast in database consoleLaravel 中的简单查询很慢,但在数据库控制台中却非常快
【发布时间】:2019-08-28 18:35:53
【问题描述】:

我有一个非常奇怪的问题,我无法理解。 我将 Laravel 用于我的后端应用程序,我在表上运行一个非常简单的查询,其中包含 30k 条记录,所有记录都带有适当的索引。 这是查询:

DB::select('select * from Orders where ClientId = ?', [$id])

在 Laravel 应用程序中,此查询运行 1.2 秒(如果我使用 Eloquent 模型,情况也是如此。):

    "query" => "select * from Orders where ClientId = ?"
    "bindings" => array:1 [▼
      0 => "44087"
    ]
    "time" => 1015.2

问题是,如果我在数据库控制台或 PHPMyAdmin 中运行相同的查询,查询大约需要 20 毫秒。

我不明白这怎么可能,因为我使用的是相同的数据库、相同的查询、相同的计算机以及与数据库的相同连接。

可能是什么原因?

【问题讨论】:

  • 很可能您在 php → html 中呈现数据,这导致了速度缓慢。通常,laravel 和控制台的查询时间几乎相同。您是否尝试过使用 dd($queryresult);并检查时差。如果有 30k 条记录,您应该使用分页。
  • @Saurav,我只获取几条记录,因此不需要分页。另外,我用 DD 函数转储数据,没有 html 或 php 渲染。
  • 你能提供这些(匿名的)30K 记录吗?
  • 您确定是查询需要这么长时间还是您的应用程序中的其他问题?
  • @Thomas 就是这样,因为我有空的 Laravel 应用程序,只有这个查询在运行。

标签: php database laravel eloquent


【解决方案1】:

PHPMyAdmin 会自动为您添加LIMIT

这是因为默认情况下 PHPMyAdmin 将始终对您的查询进行分页。

在您的 Laravel/Eloquent 查询中,您将一次性加载所有 30k 条记录。这肯定需要时间。

要解决此问题,请尝试 paginationchunking 您的查询。

总需要很长时间,是的,但是块本身会很快。

【讨论】:

  • 我敢打赌,即使在 mysql 控制台中,他也会得到快速的查询响应
【解决方案2】:

查询应该在 phpmyadmin 中具有相同的速度,否则应用程序尝试使用解释语句来查看有关查询的更多详细信息

造成这种冲突的原因可能有很多,除了 MySQL 以外的其他原因

php 脚本本身有一些函数会导致加载缓慢 尝试检查服务器error.log可能有功能错误

基本上 phpmyadmin 可能与 MySQL 连接函数中的 larval 不同尝试检查连接中使用的扩展名,可能它与您使用的 php 版本不兼容,我认为这是查询缓慢的原因

我注意到,在我制作的某些应用程序中,原因总是在 php 函数或连接中,例如 mysql_connect 比我所经历的 php

【讨论】:

    【解决方案3】:

    这里有几个问题。第一个是 laravel 的工作原理。 Laravel 只加载在你的脚本中执行的服务和类。这样做是为了节省资源,因为 PHP 旨在作为 CGI 脚本运行,而不是长时间运行的进程。因此,您的时间可能包括连接设置步骤,而不仅仅是执行查询。要获得更“可靠”的结果,请在计时简单查询之前执行任何查询。

    这种行为还有另一面。在长时间运行的进程中,比如 Job runner,你不应该改变服务参数。这可能会导致不良行为并导致您的参数更改溢出到其他作业中。例如,如果您提供 SMTP 登录功能,您应该在发送电子邮件后重置电子邮件发件人凭据,否则您会遇到一个问题,即不使用该功能的用户会像使用该功能的其他用户一样发送电子邮件。这是因为每次执行作业时都会重新加载服务,因为这是运行 HTTP 部分时的行为。

    其次,您没有使用限制。正如其他一些海报所指出的那样。

    【讨论】:

      【解决方案4】:
      1. How to enable MySQL Query Log?
      2. 通过 phpmyadmin 运行查询。
      3. 查看您在 MySQL 中实际有哪些查询。
      4. 运行应用程序。
      5. 查看您在 MySQL 中实际有哪些查询。
      6. 告诉我们,那些额外的东西是什么,会减慢速度。

      【讨论】:

        【解决方案5】:

        我几乎可以肯定这是由于 PHPMyAdmin 的使用限制,与您在页面输出中看到的内容有关。

        如果您看到 PHPMyAdmin 页面的顶部,您会看到如下内容:

        显示第 0 - 24 行(总共 314 行,查询耗时 0.0009 秒。)

        将限制添加到查询时,您应该具有相同的性能。

        【讨论】:

        • 不,不幸的是没有。我在 laravel 应用程序中使用与在 phpmyadmin 中完全相同的查询。 phpmyadmin 100ms 返回结果,Laravel 1.2 秒查询。
        • @Zaay 我知道,但 PHPMyAdmin 会自动添加该限制,即使您在查询结束时不使用该限制。
        【解决方案6】:

        我会尝试使用调试栏调试查询,看看需要多少时间,哪个需要更长的时间,...它非常易于使用和安装:https://github.com/barryvdh/laravel-debugbar 我认为您对 DB 管理感兴趣.. 也请阅读此内容,您可以获得一些想法。祝您好运

        【讨论】:

          猜你喜欢
          • 2021-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-17
          • 2015-09-02
          • 2013-01-01
          • 2015-10-30
          • 1970-01-01
          相关资源
          最近更新 更多