缓慢的MySQL性能和睡眠查询

问题描述:

最近我一直注意到在我的网站上一天的早些时候非常缓慢的加载AJAX数据。使用Chrome浏览器中的Web Developer功能,300-500ms Wait和100-300ms Receive的通常速度可以增加5秒!该网站使用jQuery,Codeigniter/PHP和MySQL。缓慢的MySQL性能和睡眠查询

我检查了我的VPS的支持台,他们提到有太多的睡眠问题。

There are many sleep queries for the database 'databasename'. 

| 4341 | mysqluser | 204.197.252.106:48669 | databasename | Sleep | 19 | | | 
| 4373 | mysqluser | 204.197.252.106:59966 | databasename | Sleep | 78 | | | 
| 4387 | mysqluser | 204.197.252.106:34807 | databasename | Sleep | 46 | | | 
| 4388 | mysqluser | 204.197.252.106:35099 | databasename | Sleep | 6 | | | 
| 4390 | mysqluser | 204.197.252.106:35452 | databasename | Sleep | 26 | | | 
| 4391 | mysqluser | 204.197.252.106:35589 | databasename | Sleep | 7 | | | 
| 4392 | mysqluser | 204.197.252.106:35680 | databasename | Sleep | 19 | | | 
| 4393 | mysqluser | 204.197.252.106:36264 | databasename | Sleep | 12 | | | 
| 4394 | mysqluser | 204.197.252.106:36327 | databasename | Sleep | 11 | | | 

这是造成早晨变慢的原因吗?我怎样才能找出造成经济放缓的原因并摆脱它?

  1. 这些sleep查询只是打开的连接。除非他们有数百人,否则我不会为他们而烦恼。他们很可能正在形成您的框架/ ORM正在使用的连接池。

  2. 若要诊断缓慢查询的问题,您需要获得slow query log。如果关闭了慢速查询记录,请立即将其打开。

  3. 一旦你有一个合适的日志文件,你将需要分析explain与缓慢运行的查询。解释将允许查看Mysql的查询规划器和分析器如何执行您的查询。

  4. 同时将解释的输出粘贴到最慢的运行查询以及表模式中,以便我们可以更好地诊断您的问题。

+1

可能意味着用户正在使用持久连接,这可能是一件坏事。 – Evert 2012-04-28 12:11:14

如果你想杀死熟睡的连接,你可以这样做: 登录MySQL作为管理员:

mysql -uroot -ppassword; 

而不是运行命令:

mysql> show processlist; 

你会得到什么如下所示:

+----+-------------+--------------------+----------+---------+------+-------+------------------+ 
| Id | User  | Host    | db  | Command | Time | State | Info    | 
+----+-------------+--------------------+----------+---------+------+-------+------------------+ 
| 49 | application | 192.168.44.1:51718 | XXXXXXXX | Sleep | 183 |  | NULL    || 
| 55 | application | 192.168.44.1:51769 | XXXXXXXX | Sleep | 148 |  | NULL    | 
| 56 | application | 192.168.44.1:51770 | XXXXXXXX | Sleep | 148 |  | NULL    | 
| 57 | application | 192.168.44.1:51771 | XXXXXXXX | Sleep | 148 |  | NULL    | 
| 58 | application | 192.168.44.1:51968 | XXXXXXXX | Sleep | 11 |  | NULL    | 
| 59 | root  | localhost   | NULL  | Query | 0 | NULL | show processlist | 
+----+-------------+--------------------+----------+---------+------+-------+------------------+ 

您将看到不同连接的完整细节。现在你可以杀死睡眠连接如下:

mysql> kill 52; 
Query OK, 0 rows affected (0.00 sec)