如何确定哪个查询执行时间最长

Posted

技术标签:

【中文标题】如何确定哪个查询执行时间最长【英文标题】:How can I determine which query is taking the longest time to execute 【发布时间】:2013-03-24 05:00:15 【问题描述】:

我有一个规则列表,并根据这些规则触发多个查询,

但是其中一个查询需要一段时间才能运行,我正试图找出哪个查询花费的时间太长,以便找出解决方案。

我不明白为什么需要太长时间(超过 7 秒)

我所有的查询都是更新、插入、删除和几个小选择

注意:我正在传递一个 jquery post 事件,所以我目前收到超时错误,这是因为页面的执行时间长于 7 秒。我可以通过增加超时值来修复它。但我想解决问题的根源。执行简单的选择、插入、更新或删除应该不会花费那么长时间。

我正在使用 PDO 来执行查询,并且我正在使用我自己的类来连接到表并执行查询。如果你想看我的课,请关注这个How can I return LastInsertID from PDO whin a method of a class

【问题讨论】:

在 chrome 上,您可以使用 pagespeed 来查看各个呼叫的执行情况,甚至网络选项卡也应该为您提供视角 为什么不能在类的方法中添加 2 个 microtime() 调用来运行查询? 如何获得 microtime() ? 【参考方案1】:

您可以启用 mysql 慢查询日志以查看哪些数据库查询需要很长时间

http://dev.mysql.com/doc/refman/5.5/en/slow-query-log.html

默认情况下,它会显示耗时超过 10 秒的查询

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_long_query_time

我建议将该参数更改为 2 秒。

【讨论】:

2 秒取决于您的项目。有些地方我认为 1 分钟快【参考方案2】:

您可以包装 PDO 类并在 query() 方法中记录执行时间。像这样的东西呢:

class MyPDO extends PDO 

    // extended query method that logs the time a query takes to execute
    public function query($sql)  
        $start = microtime(true);
        parent::query($sql);

        printf("the query %s took: %s seconds\n",
            $sql,
            microtime(true) - $start);
    

通过将PDO 替换为MyPDO 来使用该类。像这样:

旧代码

$connection = new PDO(...);

新代码

$connection = new MyPDO(...);

【讨论】:

请不要使用 printfs。为什么不做一点有用的?将其与查询一起添加到数组中,并使其仅按需打印 如何使用这种方法?每次运行查询时都调用它吗? @Mike 在您的代码中将 PDO 替换为 MyPDO 并像以前一样使用它(无需更改)。请注意,在许多情况下,使用扩展 PDO 的自定义类很有用。终于不用像这样调试了 @hek2mgl,我认为“YourCommonSense”的意思是让我更好地使用您所写的内容。他帮助我建立了我的课程,他知道我的技能有限,因此我们采用了您的功能并添加了它以使其更有用,因此我可以多次使用它:) 好的,我明白这一点,但我认为我们应该一步一步地采取。稍后会给出更好的用法示例,好吗?你现在知道如何使用 MyPDO 类了吗?否则会有所帮助【参考方案3】:

这类似于 hek2mgl 的答案,但我包含了一个解释。

当我想知道任何事情(查询、函数等)需要多长时间时,最直接的方法是在开始之前获取时间戳,然后在完成后立即获取另一个时间戳。结束时间减去开始时间,你就知道到底过了多少秒。

$start = time();
doStuff();
$end = time();
$duration_in_seconds = $end - $start;
echo "Function doStuff() took $duration_in_seconds seconds";

您可以将持续时间回显到屏幕或将其记录到文件中,只要方便。

如果您需要更精确,可以像 hek2mgl 一样使用 microtime()。

【讨论】:

以上是关于如何确定哪个查询执行时间最长的主要内容,如果未能解决你的问题,请参考以下文章

如何优化 sql 查询以避免在没有 php.ini 或设置时间限制的情况下执行最长时间 [关闭]

如何确定可执行文件是为哪个平台编译的?

CakePHP回调函数如何知道$ q是一个Query对象,哪个表执行查询?

如何确定哪个处理器的性能最高

是否可以限制 SQL Server 2000 中查询的最长持续时间?

在不实际执行查询的情况下确定 Oracle 查询执行时间和建议的数据大小