调试慢速数据库调用的一般提示或流程图?

时间:2012-07-05 19:35:10

标签: database debugging database-design

有没有人知道调试慢速数据库的通用指南?

我被要求调试一个运行速度非常慢,挂起或崩溃数据库调用的网站(不是我编写的)(一个带有MySQL后端的ZendPHP站点)。

我很高兴使用SQL,但绝不会将自己描述为devops类型或数据库开发人员,我想知道首先要问的明智问题。

我正在寻找可能的方法,例如:

  • 我想我应该首先监视,当数据库速度变慢时 - 我该怎么做?
  • 一旦我知道它何时变慢,我该如何调试这些特定的数据库调用?
  • 服务器上运行的其他进程是否可能会降低数据库速度?我该如何调试?

然后在每种情况下采取一般策略。

我希望这个问题不是太笼统。我认为这样的指南对许多开发人员非常有用。

1 个答案:

答案 0 :(得分:1)

您的第一步应该是找出数据库在缓慢时正在做什么。使用MySQL执行此操作的最简单方法是使用slow_query_log。一些明智的设置是:

log_slow_queries    = /var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes

启用此功能后,您会看到以下内容:

# User@Host: myuser[myuser] @ localhost []  # Query_time: 10.000347  Lock_time: 10.000094 Rows_sent: 2  Rows_examined: 4
SET timestamp=1341519484;
select  *  from (mytab) where (field=value);

一旦确定了一个运行缓慢的查询,您可以再次手动运行同一个查询以查明正在发生的事情,但这次以“explain”为前缀:

mysql> explain select * from mytab;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | mytab | ALL  | NULL          | NULL | NULL    | NULL |  189 |       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+

然后,您可以识别丢失索引,是否存在不必要的请求等内容。有关模式的一些信息将非常有用。

如果您还安装了像sar或atop之类的东西(例如,通过编辑/etc/init.d/atop将采样率设置得足够低,将间隔arg更改为'60'然后运行/etc/init.d/atop restart)您可以在slow_query_log中显示请求时关联服务器的行为,以确定是否存在任何其他系统争用问题。

请注意,像MySQL这样的数据库(或者实际上大多数不使用O_DIRECT的应用程序)都会利用IO缓冲,这意味着一旦访问了一个特定的数据块,它就会保留在缓冲区中,直到内核需要释放内存空间。这意味着一次又一次地运行相同的查询,如果该查询 特别低效,则每次都不会给出相同的结果。

如果您发布有关特定查询和架构的更多信息,我们可以尝试再查看一下。