|——缘起:早上刚一到公司就反映公司网站爆卡,线上erp完全无法使用,赶紧扔掉手中包子。

———————————————————————————————————————

|——排查:开发中会经常发现开发人员查一下没用索引的语句或者没有limit n的语句,这些没语句会对数据库造成很大的影响,例如一个几千万条记录的大表要全部扫描,或者是不停的做filesort,对数据库和服务器造成io影响等。

而到了线上库,除了出现没有索引的语句,没有用limit的语句,还多了一个情况,mysql连接数过多的问题。

现在,我们找去哪些长时间无响应的sql,查出他们,优化他们。

Mysql5.0以上的版本可以支持将执行比较慢的SQL语句记录下来。

mysql> show variables like 'long%'; 注:这个long_query_time是用来定义慢于多少秒的才算“慢查询”


|——查出来是2秒就算慢,默认是10秒。这里改的话:

mysql> set long_query_time=2; 注: 我设置了2, 也就是执行时间超过2秒的都算慢查询。

|——然后看看是否打开慢查询日志:

mysql> show variables like 'slow%'; //查看是否打开慢查询

 

mysql> show variables like 'slow%';
+---------------------+-----------------------------+
| Variable_name       | Value                       |
+---------------------+-----------------------------+
| slow_launch_time    |  2                          |
| slow_query_log      |  ON                         | //是否打开日志记录
| slow_query_log_file |  /data/mysql/mysqld-slow.log| //日志存放目录
+---------------------+-----------------------------+
3 rows in set (0.00 sec)

|————如果未打开慢查询日志:

mysql> set global slow_query_log='ON' 注:打开日志记录 一旦slow_query_log变量被设置为ON,mysql会立即开始记录。 /etc/my.cnf 里面可以设置上面MYSQL全局变量的初始值。 long_query_time=1 slow_query_log_file=/tmp/slow.log

 

|—————到这里,我们就可以根据日志里记录下来的sql语句执行的时间长短进行相应优化,加limit或者加索引。

排查的事情交给开发仔细排查,修改,优化。面对当前的mysql锁死,必须立即解决呐。

 

|—— 解除Locked

mysql> show processlist;

列出所有当前查询语句的查询状态[现在是查询正常,早上来的时候完全不是这样,一大列的locked]

 

|————批量kill 掉locked查询进程

 select concat('kill ',id,';') from information_schema.processlist where user='dev_team';
+------------------------+
| concat('kill ',id,';') |
+------------------------+
| kill 3101; //kill 掉单个查询
| kill 2946; //同上
+------------------------+
2 rows in set (0.00 sec) 
mysql> select concat('kill ',id,';') from information_schema.processlist where user='dev_team' into outfile '/tmp/a.txt';
query ok,2 rows affected (0.00 sec) 
mysql> source /tmp/a.txt; //全部kill掉
query ok, 0 rows affected (0.00 sec) 

|——最后:更改表引擎为innodB

 

说明:为啥要更改表引擎:MyISAM是表级锁,InnoDB是行级锁。道理就是你去看电影,一号厅4号座位被人座了,那5号座没人你可以去坐,这是针对行级锁,不能说一号厅整个厅你都不能去了,这是表级锁。

|——————查询 vmeipai库下所有表的引擎情况 [单个表的情况:show table status from 数据库库名 where name='表名' 或者:show create table 表名]

mysql> SELECT table_name, table_type, engine FROM information_schema.tables WHERE table_schema = 'vmeipai' ORDER BY table_name DESC;

 

|——————批量更改MyIsAm为InnoDB

  1. +-------------------------------------+------------+--------+
  1. | table_name | table_type | engine |
  1. +-------------------------------------+------------+--------+
  1. | v_timelinedata | BASE TABLE | MyISAM |
  1. | tempview | BASE TABLE | MyISAM |
  1. | shang_user_red | BASE TABLE | MyISAM |
  1. | shang_user_priv | BASE TABLE | MyISAM |
  1. | shang_user_exhibit | BASE TABLE | MyISAM |
  1. | shang_user_coupon | BASE TABLE | MyISAM |
  1. | shang_uploaded_file | BASE TABLE | InnoDB |
  1. | shang_trade | BASE TABLE | MyISAM |

 

|——————更改表引擎:alter table [table_name] engine = innodb;

 

生成一张sql语句列:

 

mysql --user=root --password=passwd -e "show table status from [databaseName] where Engine <> 'InnoDB'\G"|grep Name|awk '{print "alter table "$2" engine=innodb;";}' >mysqlchange

 

 

参考:

http://www.holmesian.org/MySQL_to_InnoDB  批量修改Mysql表引擎为InnoDB的方法

http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html 什么事mysql数据库

http://bbs.et8.net/bbs/showthread.php?t=1046281  【求助】频繁读写(select\update)的Mysql数据表引擎用InnoDB还是MyISAM

 

参考:

http://www.jb51.net/article/30121.htm  mysql服务器查询慢原因分析与解决方法小结

http://c20031776.blog.163.com/blog/static/68471625201122895832654/  mysql批量kill locked进度方法

http://zhumeng8337797.blog.163.com/blog/static/100768914201121183834733/   大量locked进程中,找出哪条SQL语句locked致使其他语句waiting

 

参考:http://www.cnblogs.com/jyginger/archive/2011/04/27/2030017.html  修改mysql用户密码

 

 

 

 

 

 

mysql查询慢之后的更多相关文章

  1. mysql查询性能优化

    mysql查询过程: 客户端发送查询请求. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行. 服务器进行sql解析,预处理,再由优化器生成执行计划. Mysql调用存储引擎API执行优化 ...

  2. Mysql查询——深入学习

    1.开篇 之前上一篇的随笔基本上是单表的查询,也是mysql查询的一个基本.接下来我们要看看两个表以上的查询如何得到我们想要的结果. 在学习的过程中我们一起进步,成长.有什么写的不对的还望可以指出. ...

  3. Mysql 查询练习

    Mysql 查询练习 ---创建班级表 create table class( cid int auto_increment primary key, caption ) )engine=innodb ...

  4. mysql 查询去重 distinct

    mysql 查询去重 distinct   待完善内容..

  5. MySQl查询区分大小写的解决办法

    通过查询资料发现需要设置collate(校对) . collate规则: *_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的 *_cs: ca ...

  6. 【转】mysql查询结果输出到文件

    转自:http://www.cnblogs.com/emanlee/p/4233602.html mysql查询结果导出/输出/写入到文件 方法一: 直接执行命令: mysql> select ...

  7. MySQL查询缓存

    MySQL查询缓存 用于保存MySQL查询语句返回的完整结果,被命中时,MySQL会立即返回结果,省去解析.优化和执行等阶段. 如何检查缓存? MySQL保存结果于缓存中: 把SELECT语句本身做h ...

  8. mysql 查询数据时按照A-Z顺序排序返回结果集

    mysql 查询数据时按照A-Z顺序排序返回结果集 $sql = "SELECT * , ELT( INTERVAL( CONV( HEX( left( name, 1 ) ) , 16, ...

  9. MySQL查询今天/本周/上周/本月/上个月份的数据

    MySQL查询的方式很多,下面为您介绍的MySQL查询实现的是查询本周.上周.本月.上个月份的数据,如果您对MySQL查询方面感兴趣的话,不妨一看. 查询当前今天的数据 SELECT name,sub ...

  10. [转]向facebook学习,通过协程实现mysql查询的异步化

    FROM : 通过协程实现mysql查询的异步化 前言 最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能.由于facebook实现的比较早,他们不得不对php ...

随机推荐

  1. (转)一个大牛的acm历程(看着就要颤抖)

    从我接触程序竞赛到现在应该有十多年了,单说ACM竞赛,从第一次非正式参赛到现在也差不多有7年多的样子.有太多的故事,想说的话,却一直没能有机会写下来.一方面是自己忙,一方面也是自己懒.所以很感谢能有人 ...

  2. HDU 1698 just a hook - 带有lazy标记的线段树(用结构体实现)

    2017-08-30 18:54:40 writer:pprp 可以跟上一篇博客做个对比, 这种实现不是很好理解,上一篇比较好理解,但是感觉有的地方不够严密 代码如下: /* @theme:segme ...

  3. [小问题笔记(六)] 解决JS已执行,输出内容乱码问题. 顺带总结编码相关知识

    问题: JS输出的内容出现了乱码.如图: 分析:既然年和月的数字可以正常显示,证明js加载和执行都没有问题 解决:把js引用处的编码方式改成当前页面编码一致.charset="gb2312& ...

  4. Gym - 100712B Rock-Paper-Scissors

    https://vjudge.net/problem/Gym-100712B 题意: 石头剪刀布游戏. 给出一个玩家n局的出的顺序,现在另一个是这样出的,X+Y+Z=n,在前X轮出石头,中间Y轮出布, ...

  5. [WCF安全1]使用basicHttpBinding构建UserName授权的WCF应用程序

    最近到了新公司,leader让我研究一下WCF的传输安全机制.以前也做过WCF的应用,但是很少涉及安全方面的东西.所以,花了三天的时间研究了一下如何在WCF的应用程序中配置安全.在这个系列文章中,我会 ...

  6. nethogs 按进程实时统计网络带宽利用率的工具

    安装 sudo apt-get install nethogs 使用 sudo nethogs

  7. Exception occurred during processing request: null报错

    报错, 恶心的一笔. 报错的地方 解决方法: 没注意到...

  8. PHP数组合并:[“+”运算符]、[array_merge]、[array_merge_recursive]区别

    1.“+”运算符规则: 当两个数组的键名是数字键名或者字符串键名 $c = $a + $b 在$a后追加($b在$a中不存在的键名)键名和值注意: 1.不覆盖,只是追加不存在的键名和对应的值 2.键名 ...

  9. angularjs控制器之间的数据共享与通信

    1.可以写一个service服务,从而达到数据和代码的共享; var app=angular.module('app',[]); app.service('ObjectService', [Objec ...

  10. Ansible 小手册系列 十二(Facts)

    Facts 是用来采集目标系统信息的,具体是用setup模块来采集得. 使用setup模块来获取目标系统信息 ansible hostname -m setup 仅显示与ansible相关的内存信息 ...