通常,当数据库长时间运行较慢时,罪魁祸首往往是“坏”查询。也就是说,查询未完全优化、编写不当或使用户能够从数据库中获取无限数量的行。我们可以通过在服务器上投入更多资源来减轻一些痛苦,但这实际上是一个短期解决方案,并没有解决根本问题。最好的行动方案是识别和修复问题查询,给予一些时间和精力,这应该不会太困难。 当然,第一步是确定哪个或哪些查询没有问题。有几种方法可以做到这一点,具体取决于你的特定数据库类型。今天的文章将重点介绍一些 MySQL 的策略。
使用 MySQL PROCESSLIST 表
PROCESSLIST 表是 INFORMATION_SCHEMA 数据库中的许多元数据表之一。顾名思义,它维护在数据库实例中运行的所有进程的信息。有多种方法可以访问它,如下几节所示。
使用 mysqladmin 命令行工具
mysqladmin 命令行工具随 MySQL 一起提供。使用标志“processlist”(或简称“proc”)运行它以查看当前正在运行的进程。此外,添加“statistics”标志(或简称“stat”)将显示自 MySQL 上次重启以来查询的运行统计信息
这是一些示例输出:
+-------+------+-----------+-----------+---------+------+-------+--------------------+----------+ | Id | User | Host | db | Command | Time | State | Info | Progress | +-------+------+-----------+-----------+---------+------+-------+--------------------+----------+ | 77255 | root | localhost | employees | Query | 150 | | call While_Loop2() | 0.000 | | 77285 | root | localhost | | Query | 0 | init | show processlist | 0.000 | +-------+------+-----------+-----------+---------+------+-------+--------------------+----------+ Uptime: 781398 Threads: 2 Questions: 18761833 Slow queries: 0 Opens: 2976 Flush tables: 1 Open tables: 101 Queries per second avg: 26.543
由于此命令在 shell 界面上运行,因此你可以将输出通过管道传输到其他脚本和工具。缺点是 PROCESSLIST 表的信息列总是被截断,因此它不提供较长查询的完整查询。
查询 MySQL PROCESSLIST 表
查询 PROCESSLIST 表的方法是从 MySQL 的交互模式提示中运行“show processlist;”查询。Navicat 用户可以像执行任何查询一样直接在 SQL 编辑器中执行 show processlist 查询:
请注意,有时需要在命令中添加“full”修饰符以禁用信息列的截断。(查看长查询时,这是必要的。)
使用监控工具
为了更深入地分析查询性能,许多专业数据库管理员(DBA)使用数据库监控器,例如 Navicat Monitor 。它有一个查询分析器,可以实时监控查询,以快速提高服务器的性能和效率。它显示所有正在执行的查询的摘要信息,让你轻松发现有问题的查询。如下图所示,Navicat Monitor 可以按执行时间对查询进行排序,以便可以一目了然地找到最慢的查询:
总结
在这篇文章中,我们学习了一些使用 MySQL PROCESSLIST 表和 Navicat Monitor 识别慢速查询的简单方法。