怎样把坏的MySQL查询找到并杀死?

怎样把坏的MySQL查询找到并杀死?

有时,关系型相关数据库系统的复杂性会把你搞晕,不过幸运的是,使用MySQL工具来管理查询就就可以避免这些复杂性。 在本教程中,我将向你们展示 怎样去查找并杀掉任何非法的MySQL查询。

为了浏览当前正在运行的查询,登陆到MySQL终端,然后运行‘show processlist’命令:


  1. mysql> show processlist;
  2.  
  3. +--------+--------+-----------------+---------+---------+-------+-------+------------------+-----------+---------------+-----------+
  4. | Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined | Rows_read |
  5. +--------+--------+-----------------+---------+---------+-------+-------+------------------+-----------+---------------+-----------+
  6. | 78233 | root | 127.0.0.1:37527 | mysql | Sleep | 16474 | | NULL | 6 | 6 | 6 |
  7. | 84546 | root | 127.0.0.1:48593 | mysql | Sleep | 13237 | | NULL | 2 | 2 | 2 |
  8. | 107083 | root | 127.0.0.1:56451 | mysql | Sleep | 15488 | | NULL | 1 | 121 | 121 |
  9. | 131455 | root | 127.0.0.1:48550 | NULL | Query | 0 | NULL | show processlist | 0 | 0 | 0 |
  10. +--------+--------+-----------------+---------+---------+-------+-------+------------------+-----------+---------------+-----------+
  11. 4 rows in set (0.03 sec)

首先你应该查看'Time'项,这里记录了进程执行 "做其当做的事情" 操作的秒数。‘command’项处于‘Sleep’ 状态的进程表示其正在等待接受查询,因此,它并没有消耗任何资源。对于其他任何进程而言,‘Time’超过一定的秒数表明出现问题。

在上面的例子中,唯一运行的查询是我们的‘show processlist’命令。让我们来看看如果我们有一个写的很烂的查询是怎么样的:


  1. mysql> show processlist;
  2.  
  3. +--------+--------+-----------------+-----------+---------+-------+--------------+----------------------------------+-----------+---------------+-----------+
  4. | Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined | Rows_read |
  5. +--------+--------+-----------------+-----------+---------+-------+--------------+----------------------------------+-----------+---------------+-----------+
  6. | 78233 | root | 127.0.0.1:37527 | example | Sleep | 18046 | | NULL | 6 | 6 | 6 |
  7. | 84546 | root | 127.0.0.1:48593 | example | Sleep | 14809 | | NULL | 2 | 2 | 2 |
  8. | 107083 | root | 127.0.0.1:56451 | example | Sleep | 17060 | | NULL | 1 | 121 | 121 |
  9. | 132033 | root | 127.0.0.1:54642 | example | Query | 27 | Sending data | select max(subtotal) from orders | 0 | 0 | 0 |
  10. | 133933 | root | 127.0.0.1:48679 | NULL | Query | 0 | NULL | show processlist | 0 | 0 | 0 |
  11. | 134122 | root | 127.0.0.1:49264 | example | Sleep | 0 | | NULL | 0 | 0 | 0 |
  12. +--------+--------+-----------------+-----------+---------+-------+--------------+----------------------------------+-----------+---------------+-----------+
  13. 6 rows in set (0.00 sec)

啊哈!现在我们看到有一个查询运行了将近30秒。如果我们不想让它的进程继续运行,可以将它的'Id'传递给kill命令:


  1. mysql> kill 132033;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql>

(注意 由于我们没有改变任何数据,MySQL总是报告0行被影响。)

明智的使用kill命令能够清除积压的查询。然而,要记住的是,那不是一种永久的方法 - 如果这些查询来自你的程序,你需要去重写它们,或者将继续看到相同的问题不断出现。

原文发布时间:2014-07-27

本文来自云栖合作伙伴“linux中国”

时间: 2024-10-03 21:03:44

怎样把坏的MySQL查询找到并杀死?的相关文章

MySQL 4.1.0 中文参考手册 --- 6.9 MySQL 查询缓存

mysql|参考|参考手册|缓存|中文 MySQL 4.1.0 中文参考手册 --- 犬犬(心帆)翻译 MySQL Reference Manual for version 4.1.0-alpha. 6.9 MySQL 查询缓存 从 MySQL 4.0.1 开始,MySQL server 有一个重要的特征:Query Cache. 当在使用中,查询缓存会存储一个 SELECT 查询的文本与被传送到客户端的相应结果.如果之后接收到一个同样的查询,服务器将从查询缓存中检索结果,而不是再次分析和执行这

mysql查询如何先排序再分组呢?纠结了好几天了。

问题描述 mysql查询如何先排序再分组呢?纠结了好几天了. 比如数据表"article"中有一组这样的数据: id uid title... .... .....375 1 文章标题1376 1 文章标题2377 1 文章标题3378 2 asdfasdf379 3 fdaewqwe... .... ..... 然后我写了一句这样的sql:select * from article order by id desc执行后,结果如下: id uid title... .... ....

MySQL 查询缓存 query_cache_size

MySQL 查询缓存 query_cache_size 从 MySQL 4.0.1 开始,MySQL server 有一个重要的特征:Query Cache. 当在使用中,查询缓存会存储一个 SELECT 查询的文本与被传送到客户端的相应结果.如果之后接收到一个同样的查询,服务器将从查询缓存中检索结果,而不是再次分析和执行这个同样的查询. 注意:查询缓存绝不返回过期数据.当数据被修改后,在查询缓存中的任何相关词条均被转储清除. 在某些表并不经常更改,而你又对它执行大量的相同查询时,查询缓存将是非

Mysql查询语句优化技巧_Mysql

索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整理的,主要是查询语句上面的优化,其它层面的优化技巧在此不做记录. 查询的开销指标: 执行时间 检查的行数 返回的行数 建立索引的几个准则: (1).合理的建立索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度. (2).索引越多,更新数据的速度越慢. (3).尽量在采用MyIsam作为引擎的时候使用索引(因为My

Mysql查询缓存研究

  专家简介    李季鹏 [DBA+社群•开源数据库用户组]联合发起人 5年+MySQL经验,主导运营商去IOE技术落地,精通MySQL数据库及相关解决方案,对MySQL集群架构,高可用方案有深入的研究.       MySQL的查询缓存并非缓存执行计划,而是查询及其结果集,这就意味着只有相同的查询操作才能命中缓存,因此MySQL的查询缓存命中率很低,另一方面,对于大结果集的查询,其查询结果可以从cache中直接读取,有效的提升了查询效率.       1 工作流程和相关参数及命令 1.1 工

使用Limit参数优化MySQL查询的方法_php技巧

前些天看了一个老外写的程序,在 MySQL 查询中使用了很多 Limit 关键字,这就让我很感兴趣了,因为在我印象中, Limit 关键字似乎更多被使用 MySQL 数据库的程序员用来做查询分页(当然这也是一种很好的查询优化),那在这里举个例子,假设我们需要一个分页的查询 ,Oracle中一般来说都是用以下 SQL 句子实现: SELECT * FROM ( SELECT a1.*, rownum rownum_ FROM testtable a1 WHERE rownum > 20) WHER

mysql查询学生成绩及各科成绩的排名

问题描述 mysql查询学生成绩及各科成绩的排名 学生表student有主键id,学号stuNum,姓名stuName, 课程表course有课程名称主键id,cname 成绩表sc有主键id,学生表id,课程表id 班级表class有主键id,班级名称cname,外键gid关联年纪表的id主键 年纪表grade有主键id,年纪名称gname 年纪-课程表gc有主键id,年纪表gid,课程表cid 所有的表主键id都是uuid 现在查询一个学生的各科成绩以及每科的成绩在班级和在年纪的排名,(如可

mysql查询区分大小写高性能

 mysql查询默认是不区分大小写的 如: 1 2 3 4 5 6 7 <a href="/tags.php/select/" target="_blank">select</a>  * from  table_name where  a like  'a%'       select  * from  table_name where  a like  'A%'       select * from table_name where a 

MySQL查询和修改auto

 本文实例讲述了MySQL查询和修改auto_increment的方法.分享给大家供大家参考.具体如下: 查询表名为tableName的auto_increment值: 代码如下: SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name="tableName";   修改表名为tableName的auto_increment值: 代码如下: ALTER TABLE tableName auto_incr