Navicat 博客

识别费时查询 2021 年 8 月 23 日,由 Robert Gravelle 撰写

通常,当数据库长时间运行较慢时,罪魁祸首往往是“坏”查询。也就是说,查询未完全优化、编写不当或使用户能够从数据库中获取无限数量的行。我们可以通过在服务器上投入更多资源来减轻一些痛苦,但这实际上是一个短期解决方案,并没有解决根本问题。最好的行动方案是识别和修复问题查询,给予一些时间和精力,这应该不会太困难。 当然,第一步是确定哪个或哪些查询没有问题。有几种方法可以做到这一点,具体取决于你的特定数据库类型。今天的文章将重点介绍一些 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 查询:

show_processlist (47K)

请注意,有时需要在命令中添加“full”修饰符以禁用信息列的截断。(查看长查询时,这是必要的。)

使用监控工具

为了更深入地分析查询性能,许多专业数据库管理员(DBA)使用数据库监控器,例如 Navicat Monitor 。它有一个查询分析器,可以实时监控查询,以快速提高服务器的性能和效率。它显示所有正在执行的查询的摘要信息,让你轻松发现有问题的查询。如下图所示,Navicat Monitor 可以按执行时间对查询进行排序,以便可以一目了然地找到最慢的查询:

query_analyzer (125K)

总结

在这篇文章中,我们学习了一些使用 MySQL PROCESSLIST 表和 Navicat Monitor 识别慢速查询的简单方法。

点击此处了解有关 Navicat Monitor 的所有功能的更多详细信息,或下载 14 天全功能免费试用版!

Navicat 文章
频道条目
分享
文章归档