MySQL 关键指标

导航至

也许你还记得 Blogger——不是实际的商业网站,看起来功能齐全且设计精良——而是我的业余项目,故障和低效的完美结合,需要随时监控。Blogger 不可信。请看我的第一篇关于它的帖子here.                         

<figcaption> 我试图让它变得更美观,结果反而更丑陋。虚荣,你的名字是 Blogger。</figcaption>

 

我们开始了指标的初步探索,关注 Blogger 的请求数量。但 Blogger 不太可能因流量过载而崩溃,所以我们不必担心它收到了多少请求。让我们担心它的性能如何。

在主页上添加更多内容使 Blogger 变慢了。最近的文章和最近的活动确实加载了……最终。如果我没有对 Blogger 投入情感,我就不会等待。大多数用户不会。想象一下,如果您的 Google 搜索结果需要 30 秒才能显示出来。您会关注 Bing。因为最近的文章和最近的活动都应该从数据库中检索数据,所以是时候监控 MySQL,Blogger 的数据库了。

<figcaption> 想象一下倒过来用于数据检索</figcaption>

 

首先,我们需要确定哪些指标值得监控。快速搜索互联网(快速 = 仅 3 次狗狗视频休息)显示了 MySQL 输出的指标数量。非常多。如果我想,我可能会找到它母亲的娘家姓和它的第一个童年宠物。

但评估性能不需要所有这些指标。有四个方面可以揭示 MySQL 的情况:你不会相信第四个方面。开玩笑的——它们都完全有道理。

吞吐量

最重要的是,数据库的工作是运行查询。它 想要 运行查询——以至于它会运行你要求的尽可能多的查询,无论负担如何,这在某些时候可能会成为问题。MySQL 有一些方便的状态变量,我们可以用来检查它:Queries(服务器端)和 Questions(客户端)。

<figcaption> 尼尔·德格拉斯·泰森博士作序</figcaption>

 

msql>SHOW GLOBAL STATUS LIKE "Questions";

+---------------+--------+

| Variable_name | Value  |

+---------------+--------+

| Questions     | 282590 |

+---------------+--------+

1 row in set (0.00 sec)

 

msql> SHOW GLOBAL STATUS LIKE "Queries";

+---------------+--------+

| Variable_name | Value  |

+---------------+--------+

| Queries       | 294564 |

+---------------+--------+

1 row in set (0.00 sec)

老实说,这些数字对我来说毫无意义,但我确定它们从数据库创建时开始累积。读取和写入的细分会更有帮助。猜猜谁有这些变量?

<figcaption> 是 MySQL。MySQL 有这些变量。</figcaption>

 

Com-select 显示读取,Com-insert、Com_update 和 Com-delete 的组合将显示写入(这些也是累积数字)。

mysql> show global status like "Com_select";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Com_select    | 28854 |

+---------------+-------+

1 row in set (0.01 sec)

 

mysql> show global status like "Com_insert";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Com_insert    | 69317 |

+---------------+-------+

1 row in set (0.00 sec)

执行时间

如果查询量看起来正常,但瓶颈仍然存在,执行时间是下一步。当然,Blogger 可以处理所有 294564 个查询,但如果其中一个查询需要五分钟才能完成,那就不行了。MySQL 有一个快速检查方法,可以使用变量 Slow_queries。

mysql> show global status like "Slow_queries";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Slow_queries  | 0     |

+---------------+-------+

1 row in set (0.00 sec)

欢呼!

当然,这可能并不总是零。Blogger 没有慢查询,要么是因为我是超级程序员,要么是因为它实际上并没有做任何复杂的事情。谁知道呢?

并发

MySQL 中的事务数量与同时发生的事务数量同样重要。让我们假设 Blogger (再次强调,不是实际的商业 Blogger,而是我的 Frankenstein)成功了。它是博客界的比特币(可能在某个地方有一个实际的商业计划)。

<figcaption> 加密博客是未来</figcaption>

 

如果 Blogger 每秒收到 2 万个查询(因为它在这种情况下非常受加密货币欢迎),平均延迟为 2 毫秒(延迟基于我将在下一节中展示的查询),那将是 40 个并发查询。但如果 MySQL 挂起哪怕 100 毫秒(让我们在这种情况下归咎于操作系统),那将影响 4 千个查询。哇。

如果您想了解更多关于其工作原理的信息,请阅读《Understanding MySQL internals》。非常有趣。

再说一遍,MySQL 想要帮助我们。又一个变量,又是 MySQL 的一天。Threads_running 将显示当前正在运行的线程数,如果您想要更多信息,还可以查看“Threads_connected”和“threads_created”。

mysql> SHOW GLOBAL STATUS LIKE "Threads_running";

+-----------------+-------+

| Variable_name   | Value |

+-----------------+-------+

| Threads_running | 1     |

+-----------------+-------+

1 row in set (0.00 sec)

利用率

这是一种广泛的说法:监控您的资源。但具体来说,利用率是指资源繁忙的时间量(或百分比)。对于数据库,这意味着每个连接繁忙的时间百分比(哦,如果您想查看连接,还有一个变量:“Connections”),或者数据库可访问的时间量。当您确定存在问题,但不知道问题是什么时,利用率最有帮助。

<figcaption> 我的数据中有些东西看起来不一样了</figcaption>

 

让 MySQL 来帮助我们弄清楚这一点。它在 performance_schema DB 和 sys DB 中总结了很多这些指标并准备好进行查询(sys DB 更易于人类阅读,如果您恰好是人类的话)。使用 sys DB,我可以找到最慢的查询。

 

mysql> SELECT * FROM sys.statements_with_runtimes_in_95th_percentile;

输出虽然易于人类阅读,但可能非常广泛。在您的机器上运行它,看看会发生什么!

这是我运行的查询,用于查找并发示例中每个模式的平均运行时间。blogger_test 的检查结果为 2123 微秒,平均而言,一个查询从到达到完成大约需要 2 毫秒。

mysql> SELECT schema_name
 , SUM(count_star) count
 , ROUND( (SUM(sum_timer_wait) / SUM(count_star))
           / 1000000) AS avg_microsec
 FROM  performance_schema.events_statements_summary_by_digest
 WHERE schema_name IS NOT NULL
 GROUP BY schema_name;

+---------------------+--------+--------------+
| schema_name | count | avg_microsec |
+---------------------+--------+--------------+
| blogger_development | 248834 | 149 |
| blogger_test        | 188    |2123 |
| information_schema  | 3      | 156 |
| performance_schema  | 17     | 578 |
| sys                 | 8      |5437 |
+---------------------+--------+--------------+
5 rows in set (0.00 sec)

结论

performance_schema 中有一些令人惊叹的指标可用,您应该花时间探索,以防 MySQL 出现紧急情况,这样您就知道当 SQL 的冰冷之手向您伸来时该去哪里寻找。

既然我们已经确定了哪些指标重要,我将继续探索 MySQL。在我的下一篇文章中,我将专门讨论 Blogger 中的吞吐量、执行时间、并发性和利用率。