我正在开发一个大型Web应用程序,并希望它根据与数据库当前所处压力相关的因素进行更改。
我不确定最准确/最有效/最简单的是什么。我正在考虑当前连接的数量或服务器响应时间或CPU使用情况?
什么是最适合和可能的?
由于
答案 0 :(得分:1)
MySQL Query Profiler可以满足您的需求。
http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html
如果您愿意花钱购买图形分析器,请尝试一下:
答案 1 :(得分:1)
数据库所处的“压力”量并不是非常真实的指标。重要的是确定应用程序的可伸缩性,以及数据库对不可接受的性能造成影响的外部网。这听起来有点像了,但是如果没有明确的目标来实现你想要实现的目标,花费时间和精力就没什么意义了。
重要的是要开始在您的网络服务器日志中记录微秒级别的响应时间,并在mysql中启用慢速查询记录。然后测试你的DBMS,看看什么是缓慢的,什么是缓慢的,经常被击中,以及随着需求的增加会减慢。
当然,如果您遇到性能问题,那么一定要开始考虑CPU,内存使用情况和I / O,但这些主要是性能问题的症状 - 而不是真正的指标。您可能拥有10%的CPU使用率,并且您的系统可能像狗一样运行,或95%的使用率并且像灰狗一样运行;)。
系统负载(即运行队列的平均长度是比CPU更好的指标 - 但仍然在测量symtpom。一般来说,数据库相关的缓慢通常主要是关于I / O问题,通常通过SQL调优来解决。
下进行。
答案 2 :(得分:0)
有趣的问题。你真正想要的是一种让PHP向mySQL服务器提出两个问题的方法:
服务器,您使用几乎所有的CPU容量吗?
服务器,您是否正在使用几乎所有的磁盘IO容量?
根据答案,我想您希望简化PHP Web应用程序的工作...可能通过消除某种搜索功能或更积极地缓存某些数据。
如果你的(linux或bsd)mysql服务器有一个shell,你可以通过观察这两个命令的输出来回答你的两个问题。
sar -u 1 10 # the %idle column tells you about unused cpu cycles
sar -d 1 10 # the %util column tells you which disks are busy and how busy.
但是,没有一个很好的小查询可以将这些数据从mySQL提取到你的应用程序。
编辑:一种可能性是编写一些PERL黑客或其他在您的服务器上运行的简单程序,连接到本地数据库,并且每隔一段时间(每分钟一次)确定%idle和%util,并更新数据库中的一个小行表。如果你关心的话,你可以毫不费力地添加诸如磁盘装满的东西到这个表。然后您的PHP应用程序可以查询此表。这是MEMORY访问方法的理想用途。无论如何,请保持简单:您不希望监控对您的服务器造成压力。
第二个最好的技巧,你可以从你的客户那里做。
发出命令SHOW PROCESSLIST FULL,计算Command为“Query”的行数(mySQL进程),如果你有很多,则认为它是一个高工作负载。
您还可以为状态为Query的进程添加时间值,并使用该值的高值作为阈值。
编辑:如果您在mySQL 5服务器上运行,并且您的服务器帐户可以访问mySql提供的information_schema,您可以直接使用查询来获取我提到的流程数据:
SELECT (COUNT(*)-1) P.QUERYCOUNT, SUM(P.TIME) QUERYTIME
FROM information_schema.PROCESSLIST P
WHERE P.COMMAND = 'Query'
COUNT(*) - 1:因为上述查询本身被视为查询。
您需要调整阈值以使其在生产中正常工作。
当数据库服务器无法跟上时,让PHP Web应用程序卸载是个好主意。不过,更好的想法是识别长时间运行的查询并对其进行优化。