返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何在Laravel中找到最慢的查询
  • 1
分享到

如何在Laravel中找到最慢的查询

2024-04-02 19:04:59 1人浏览 佚名
摘要

你的网站慢吗?加载需要很长时间吗?用户是否抱怨它几乎 无法使用 ?您应该检查您的数据库查询。我将向您展示一种轻松分析所有数据库查询的简洁方法。当然,您的网站速度慢的原因有很多,但最常见的原因之一是数据库查询速度慢。但是在 laravel 中

你的网站慢吗?加载需要很长时间吗?用户是否抱怨它几乎 无法使用 ?您应该检查您的数据库查询。我将向您展示一种轻松分析所有数据库查询的简洁方法。

当然,您的网站速度慢的原因有很多,但最常见的原因之一是数据库查询速度慢。

但是在 laravel 中,我们(大多数时候)不使用 sql 从数据库中获取数据,我们使用 Eloquent ORM 和 查询构建器 ,这有时会导致很难查明造成我们网站如此缓慢的查询。

DB::listen()

幸运的是,在 laravel 中,我们可以定义一个在每次执行查询时调用的回调。为此,请将以下代码添加到任何服务提供者(例如 AppServiceProvider):

public function boot()
{
    DB::listen(function ($query) {
    // TODO: make this useful
    });
}

如您所见,我们接收了一个变量 $query,这个变量是 QueryExecuted 类的一个实例。这意味着我们可以访问有关已执行查询的一些信息:

 DB::listen(function ($query) {
     $query->sql; // 执行的 sql 字符串
     $query->bindings; // 传递给sql查询的参数(这将替换sql字符串中的 "?")
     $query->time; // 执行查询所用的时间;
 });

这是非常有用的信息,现在我们可以通过查看 $query->time 属性来识别慢查询。 但这并没有告诉我们在我们的代码中查询执行的位置

我怎么知道查询是在哪里执行的?

即使该 $query 变量没有给我们任何关于其来源的信息, 我们仍然可以使用 PHP 内置函数  debug_backtrace() 获取该信息。

DB::listen(function ($query) {
    dd(debug_backtrace());
});

如果你在你的项目上运行它,你会在浏览器上看到类似这样的东西:

array:63 [▼
  0 => array:7 [▼
 "file"=>"/home/cosme/Documents/projects/cosme.dev/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php"
    "line" => 404
    "function" => "App\Providers\{closure}"
    "class" => "App\Providers\AppServiceProvider"
    "object" => App\Providers\AppServiceProvider {#140 ▶}
    "type" => "->"
    "args" => array:1 [▶]
  ]
  1 => array:7 [▼
    "file" => "/home/cosme/Documents/projects/cosme.dev/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php"
    "line" => 249
    "function" => "Illuminate\Events\{closure}"
    "class" => "Illuminate\Events\Dispatcher"
    "object" => Illuminate\Events\Dispatcher {#27 ▶}
    "type" => "->"
    "args" => array:2 [▶]
  ]
  2 => array:7 [▼
    "file" => "/home/cosme/Documents/projects/cosme.dev/vendor/laravel/framework/src/Illuminate/Database/Connection.php"
    "line" => 887
    "function" => "dispatch"
    "class" => "Illuminate\Events\Dispatcher"
    "object" => Illuminate\Events\Dispatcher {#27 ▶}
    "type" => "->"
    "args" => array:1 [▶]
  ]
  ....

这是一个数组,其中包含请求中到目前为止的每个函数调用。我将只关注每个数组中的 fileline 键。

如果你仔细看,你会发现在我的例子中有 63 个函数调用,这是一个简单的应用程序,如果在更复杂的应用程序中,可能会更多。更糟糕的是,如果您查看顶部的那些, 它们都是 laravel 框架的内部函数。我们是否应该逐一查看,直到找到可能对我们有帮助的东西?

查找查询位置

正如我之前所说,它们中的大多数是内部框架调用,这意味着这些文件中的大多数都在我们的 vendor/ 目录中。这意味着我们可以检查每个 file 并过滤掉任何具有 vendor/ 的调用,如下所示:

DB::listen(function ($query) {
    $stackTrace = collect(debug_backtrace())->filter(function ($trace) {
        return !str_contains($trace['file'], 'vendor/');
    });

    dd($stackTrace);
});

在这里,我将数组转换为集合以使用该 filter 方法,如果 file 当前 $tracevendor/ 我们将其从集合中删除。

如果您运行上面的代码,您将看到如下内容:

Illuminate\Support\Collection {#1237 ▼
  #items: array:5 [▼
    12 => array:7 [▼
      "file" => "/home/cosme/Documents/projects/cosme.dev/app/Models/Post.php"
      "line" => 61
      "function" => "get"
      "class" => "Illuminate\Database\Eloquent\Builder"
      "object" => Illuminate\Database\Eloquent\Builder {#310 ▶}
      "type" => "->"
      "args" => []
    ]
    16 => array:6 [▶]
    17 => array:6 [▶]
    61 => array:7 [▶]
    62 => array:4 [▶]
  ]
  #escapeWhenCastingToString: false
}

这些项目要少得多,我们从 63 个变成了只有 5 个。最好的部分是集合中的第一项是我们触发 SQL 查询的确切位置。这意味着我们可以提取该信息以找到最慢的查询。

打印到日志

既然我们拥有了我们需要的所有信息,为什么不记录它以便我们可以检查并查找最慢的查询?:

public function boot()
{
    DB::listen(function ($query) {
        $location = collect(debug_backtrace())->filter(function ($trace) {
            return !str_contains($trace['file'], 'vendor/');
        })->first(); // grab the first element of non vendor/ calls

        $bindings = implode(", ", $query->bindings); // format the bindings as string

        Log::info("
            ------------
            Sql: $query->sql
            Bindings: $bindings
            Time: $query->time
            File: ${location['file']}
            Line: ${location['line']}
            ------------
        ");
    });
}

如果您在应用程序中使用它,您可以检查您的日志文件,您应该会看到如下查询信息:

[2022-02-03 02:20:14] local.INFO:
------------
Sql: select "title", "slug", "body" from "posts" where "published" = ? order by "id" desc   
Bindings: 1
Time: 0.18
File: /home/cosme/Documents/projects/cosme.dev/app/Models/Post.php
Line: 61
----------

现在您知道哪些查询是最慢的,并开始一一处理它们,尝试使它们更快,或者至少缓存它们。

--结束END--

本文标题: 如何在Laravel中找到最慢的查询

本文链接: https://lsjlt.com/news/33989.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在Laravel中找到最慢的查询
    你的网站慢吗?加载需要很长时间吗?用户是否抱怨它几乎 无法使用 ?您应该检查您的数据库查询。我将向您展示一种轻松分析所有数据库查询的简洁方法。当然,您的网站速度慢的原因有很多,但最常见的原因之一是数据库查询速度慢。但是在 laravel 中...
    99+
    2024-04-02
  • Laravel中如何找到最慢查询
    本篇内容介绍了“Laravel中如何找到最慢查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!DB::listen()幸运的是,在 lara...
    99+
    2023-07-04
  • 通过慢查询找到阻塞的命令
    如何通过慢查询找到阻塞的命令?针对这个问题,今天小编总结这篇有关redis阻塞的文章,希望帮助更多想学习redis的同学找到更加简单易行的办法。和Mysql一样,Redis也有慢查询记录。当命令的执行时间超...
    99+
    2024-04-02
  • 如何在MySQL中慢查询日志
    如何在MySQL中慢查询日志?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是慢查询日志MySQL的慢查询日志是 MySQL提供的一种日志记录,它用来记录在 ...
    99+
    2023-06-14
  • 如何在MySQL中开启慢查询日志
    如何在MySQL中开启慢查询日志?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(1)配置开启Linux:在mysql配置文件 my.cnf 中...
    99+
    2024-04-02
  • 如何在MySQL中使用慢查询日志
    这期内容当中小编将会给大家带来有关如何在MySQL中使用慢查询日志,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。慢查询日志相关参数MySQL 慢查询的相关参数解释:slo...
    99+
    2024-04-02
  • 如何找出Mysql查询速度慢的SQL语句
    小编给大家分享一下如何找出Mysql查询速度慢的SQL语句,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!启动Mysql时加参数-...
    99+
    2024-04-02
  • 如何从MYSQL查询日志中过滤出的慢查询日志并找出TOP SQL
    如何从MYSQL查询日志中过滤出的慢查询日志并找出TOP SQL,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 在 MYSQL 慢查...
    99+
    2024-04-02
  • 如何在mysql数据库中开启慢查询
    如何在mysql数据库中开启慢查询?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、开启慢查询1> 查看慢查询是否开启s...
    99+
    2024-04-02
  • 在mysql如何查找效率慢的SQL语句
    这篇文章主要介绍在mysql如何查找效率慢的SQL语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句1,slow_...
    99+
    2024-04-02
  • mysql的慢查询日志如何查看
    要查看MySQL的慢查询日志,您可以按照以下步骤操作: 登录MySQL数据库服务器,可以通过命令行或者图形化工具进行登录。 ...
    99+
    2024-05-14
    mysql
  • python如何在列表中查找最频繁的元素
    这篇文章将为大家详细讲解有关python如何在列表中查找最频繁的元素,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在列表中查找最频繁的元素在列表中大部分时间出现的元素,然后将成为列表中最频繁出现的元素。 ...
    99+
    2023-06-27
  • linux中如何找到最大的文件
    小编给大家分享一下linux中如何找到最大的文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!找到最大的文件应用程序:Shell计算机中一个常见的问题是,你可能想...
    99+
    2023-06-27
  • 无法在php中查找到memcache如何解决
    无法在php中查找到memcache如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。php找不到memcache的解决办法:1、写一个phpinfo查看文...
    99+
    2023-06-14
  • MySQL 中查询速度慢如何解决
    这篇文章给大家介绍MySQL 中查询速度慢如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、什么影响了数据库查询速度1.1 影响数据库查询速度的四个因素1.2 风险分析QPS:...
    99+
    2024-04-02
  • mysql如何查询慢的sql语句
    这篇文章主要讲解了“mysql如何查询慢的sql语句”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql如何查询慢的sql语句”吧! ...
    99+
    2024-04-02
  • MariaDB中如何监控和调试慢查询
    在MariaDB中,可以通过以下步骤来监控和调试慢查询: 启用慢查询日志:在MariaDB的配置文件中(通常是my.cnf或my....
    99+
    2024-04-09
    MariaDB
  • MySQL如何在查询中使用子查询
    MySQL中可以在查询中使用子查询来实现更复杂的查询逻辑。子查询是一个嵌套在主查询中的查询语句,通常用于获取主查询中某些条件的结果,...
    99+
    2024-03-06
    MySQL
  • 如何在线安全清空慢查询日志slowlog
    这篇文章将为大家详细讲解有关如何在线安全清空慢查询日志slowlog,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 mysql> sh...
    99+
    2024-04-02
  • Java如何查找数组中最大值
    这篇“Java如何查找数组中最大值”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何查找数组中最大值”文章吧。方式一...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作