我正在尝试提高服务器性能,很明显 MySQL 是导致该问题的主要原因。但是,对其进行故障排除非常困难。我使用慢查询日志来定位特定类型的查询,但真正的问题是 Java 进程、PHP 进程和 cron 作业(通常也是 PHP 进程,但通过命令行而不是通过 Apache 运行)使用 MySQL
通常,当服务器变慢时,我会运行一些命令,如“ps”或“top”,以尝试找到罪魁祸首,但即使我知道 MySQL 是罪魁祸首,我也不知道我提到的三个“领域”中的哪一个可能真正导致速度变慢。换句话说,我很想以某种方式分解它,并看到,例如,当时对 MySQL 的需求中有 80% 是由于来自 PHP 的查询,而只有 20% 来自 Java。由于我有从两个“领域”触发的自动化任务和定期事件,因此很难仅通过反复试验来隔离它们的影响。
所有内容都驻留在一台服务器上,因此所有 MySQL 查询都来自本地主机。我是否也可以“标记”查询、为其添加注释,或者以其他方式添加某种元数据,以便稍后分析这些标记以获得相对负载?
我怀疑是否有办法获得这样的信息,但如果有人能帮助提供一种方法来进一步细分 MySQL 负载,以帮助识别这些查询的来源(进程 ID 也可能有效),那将大有帮助。谢谢!
答案1
我建议使用MySQL 代理。使用 MySQL Proxy,您可以拦截并记录进入服务器的每个查询。
一个更简单的方法是运行mysqlbinlog
分析 MySQL 生成的二进制日志文件(参见man mysqlbinlog
)。
无论如何,如果您还没有这样做,最好运行一下mysqltuner
以查看是否存在任何明显的问题或瓶颈(例如,执行没有索引的 JOIN 的查询数量异常)。
答案2
您是否尝试过登录 mysql 服务并发出显示完整流程列表或使用麦托普查看哪些查询正在运行?
SHOW FULL PROCESSLIST
提供 MySQL 当前正在执行的所有查询和任务的列表。它需要以具有数据库中“PROCESS”或“SUPER”权限的用户身份运行。mysqladmin 也有一个 processlist 参数。
mytop 非常适合显示服务器的持续运行情况。可以将其视为 MySQL 的 top 之类的东西。
这两者都会告诉您正在运行哪些命令、它们来自哪里以及 MySQL 迄今为止尝试为它们提供服务多长时间。
掌握了这些信息后,您就可以决定要做什么了。如果系统是写受限的,您可能需要对数据进行分区。如果是读受限的,有些事情可以提供帮助。在许多情况下,正确地索引表可以显著提高读取性能。如果您有很多相同的查询,添加缓存可能会有所帮助。添加读取从属也可以提高性能。缓存和添加从属将提高性能,但会给您的网络和应用程序增加一些额外的复杂性。
答案3
一种可能性是确保不同的进程使用不同的凭据连接到 mysql。我很确定 mysql 会在查询日志中记录执行查询的用户名。
答案4
显示完整流程清单;
这显示了进程和运行时。为了区分源,您可以为每个“领域”使用不同的登录名,或者在所有查询中预先添加领域。例如,这是一个有效的查询:
/* php */ 从项目中选择 *;
原样:
/* java */ 从项目中选择 *;
ETC。
但您仍然看不到查询导致的系统负载。无论如何,这都是有用的,而且您可以破解监控工具来绘制数据图表,以寻找与您的性能的相关性。