如何确定哪个查询执行时间最长
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对象,哪个表执行查询?