我的服务的平均负载很高,一直在 15 左右。
而造成这种情况的原因是 Mysql 超载了。
我想知道我怎样才能找出哪个特定查询/脚本最消耗Mysql资源?
谢谢。
答案1
如果您正在寻找麻烦的查询,则需要检查慢查询日志,该日志可能位于 <datadir>/<hostname>-slow.log 中,但日志记录由变量指定:
mysql> show variables like '%slow_quer%';
这将向您显示慢速查询(定义为花费的时间比变量“long_query_time”更长)和哪个(mysql)用户执行了它们,但不显示它们来自哪个脚本。
您可能还想研究命令“EXPLAIN”并在网络上搜索有关“SQL 查询优化”的提示。如果您之后需要更多帮助,请返回获取更多信息。
答案2
如果您有长时间运行的查询,您可能能够通过监视来捕获它们的运行情况:
watch --interval=1 "mysql -e 'SHOW PROCESSLIST'"
您应该能够在进程列表中看到查询。如果您看不到整个查询,只需将“SHOW PROCESSLIST”替换为“SHOW FULL PROCESSLIST”。您应该看到调用查询的用户名以及他们正在运行查询的数据库。从那里,您可以使用 grep 检查代码中的查询。
如果您使用像 rails/django 这样的框架,那么可能会稍微困难一些,因为这些框架中内置的数据库 ORM 会将实际的原始查询从您的视图中隐藏起来。;-)