1

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

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

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

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

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

我正在使用 PDO 执行查询,并且我正在使用自己的类连接到表并执行查询。如果你想看我的课,请按照这个我如何从 PDO 中返回 LastInsertID 以及一个类的方法

4

3 回答 3

2

您可以启用 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 秒。

于 2013-04-02T18:49:52.107 回答
0

您可以包装 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);
    }
}

通过替换为来使用PDOMyPDO。像这样:

旧代码

$connection = new PDO(...);

新代码

$connection = new MyPDO(...);
于 2013-04-02T18:50:56.830 回答
0

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

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

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

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

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

于 2013-04-02T19:00:20.847 回答