如何在PHP中测量MySQL时间、查询的时间和/或负载?
如何在PHP中测量mysql时间,sql查询的时间和/或负载?
这个问题的出现是因为数据库和Web服务器位于不同的位置,而且您尝试使用PHP来实现它。
限制:
- 您需要同时访问两个服务器(如ssh)。
- 如果在数据库中嵌入CPU负载检查,例如使用exec_shell ssh,然后在每次查询执行时返回uptime,就会过度负荷。
解决方法:
在数据库服务器中嵌入一个cron任务,如果服务器负载过高,定期发送电子邮件。
或者,在数据库中,定期发送电子邮件以报告当前运行的查询,使用show full processlist命令。
以下是将SHOW FULL PROCESSLIST存储到文件的示例:
$con = mysqli_connect(...) or die('unable to connect'); $sql = "show full processlist"; $res = mysqli_query($con, $sql) or die($sql); /* optional path is /tmp */ $fp = fopen('/tmp/'.date('YmdHis'), 'w+'); while ($row = $res->fetch_row()) { fputcsv($fp, $row); } $res->free_result();
上述代码足以将当前的mysql进程列表转储到文件中。
在Linux系统中,有很多命令可以显示CPU负载。
但是在Windows系统中,您可以通过在Google或SO上进行搜索来找到相关信息。
我正在使用与我的ISP托管包相同的共享服务器,那么我能够区分哪些查询时间/负载是我的问题吗?
- 可以使用show full processlist命令来查看数据库连接。
我询问了我的ISP,要求他们启动show full processlist的分析,并将结果作为记录发送电子邮件或存储在服务器上以供以后访问。
如果您的托管服务器是Windows系统,那么请再次与ISP确认,他们是否有Windows任务计划程序。如果有的话,您可以要求ISP每分钟监视show full processlist命令,并将结果发送为电子邮件,或在服务器上输出到一个位置。这样,当服务器负载升高时,您可以查看同时运行的查询。如果没有明显的慢查询,那么可能是您的应用程序不是问题的原因。
如果没有这样的任务可用,您可以尝试在您的Windows Web服务器上设置定时任务,并执行show full processlist命令来监视数据库。
然而,将show full processlist的结果解析并过滤出自己的查询项,然后发送电子邮件,可能相对困难。
更简单的方法是准备一个PHP脚本,执行show查询,迭代结果(使用fetch_row),并使用类似“20101122080000”的文件名将结果fputcsv到文件中。请参考上述代码示例。
问题的原因:用户想要在PHP中测量MySQL查询的时间和/或负载,以便进行错误处理和发送邮件通知。
解决方法:通过查看查询分析器来测量查询时间。用户可以在脚本的开头启用查询分析器,并在结束时执行"show profiles"查询。用户可以使用他们熟悉的标准PHP函数。
以下是原始内容的整理:
有一个查询分析器,可以部分满足您的需求。
https://www.digitalocean.com/community/tutorials/how-to-use-mysql-query-profiling
https://dev.mysql.com/doc/refman/5.5/en/show-profile.html
有各种工具可以查看服务器的负载。
但是我看不到如何在php中输出这个?我真的希望在php中有一些错误处理,如果情况变得糟糕,我可以发送电子邮件。
您可以在脚本的开头启用分析,然后在最后执行show profiles
查询。您可以使用您习惯使用的标准PHP函数。
链接不存在了。
链接又坏了。
问题的原因是用户想要测量MySQL查询的时间和/或负载,以便确定查询的执行效率。用户给出了一个PHP代码示例来计算查询的执行时间。然后用户提出了几个问题:1. 如果数据库和Web服务器位于不同的服务器上,该方法将无法区分数据库是否运行缓慢还是Web服务器是否运行缓慢。2. 考虑到PHP页面只是等待MySQL查询完成,这种方法可能已经足够好来确定查询的执行时间。但是,这种方法无法帮助用户找到CPU使用率。答案是,这个方法只能测量墙时而不是CPU时间。
为了解决这个问题,可以使用MySQL的内置函数来测量查询的执行时间和负载。在查询之前,使用microtime()
函数来获取开始时间。然后执行查询。查询完成后,再次使用microtime()
函数获取结束时间。最后,计算开始时间和结束时间的差异,即可得到查询的执行时间。
以下是修改后的代码示例:
$starttime = microtime(true); $query = mysql_query("SELECT * FROM table"); $endtime = microtime(true); $execution_time = $endtime - $starttime; echo "Query Execution Time: " . $execution_time . " seconds";
这样,用户就可以通过$execution_time
变量获取查询的执行时间了。注意,microtime()
函数的参数设置为true
,以便返回一个浮点数表示的时间。
通过这种方法,用户可以准确地测量查询的执行时间,而不受数据库和Web服务器位于不同服务器的影响,并且可以避免使用墙时作为测量标准。