1.开启慢SQL日志
```
slow_query_log 慢查询开启状态
slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)
long_query_time 查询超过多少秒才记录
```
2.问题分析
利用explain指令获得该SQL语句的执行计划,根据该执行计划,可能有两种场景。
* SQL不走索引或扫描行数过多等致使执行时长过长。
* SQL没问题,只是因为事务并发导致等待锁,致使执行时长过长。
**场景一 **
2.1 优化SQL
通过增加索引,调整SQL语句的方式优化执行时长, 例如下的执行计划:

该SQL的执行计划的type为ALL,同时根据以下type语义,可知无索引的全表查询,故可为其检索列增加索引进而解决。

**场景二**
2.2 查询当前事务情况
可以通过查看如下3张表做相应的处理:
~~~
-- 当前运行的所有事务
select * from information_schema.innodb_trx;
-- 当前出现的锁
SELECT * FROM information_schema.INNODB_LOCKS;
-- 锁等待的对应关系
select * from information_schema.INNODB_LOCK_WAITS;
~~~
查看事务的状态trx_state:RUNNING、LOCK WAIT
查看事务需要的锁trx_requested_lock_id
查看事务的sql语句trx_query
查看当前锁的类型lock_mode:X、S
查看当前锁的级别lock_type:record、table、page
查看当前锁的表名lock_table
2.3 分析
根据事务和锁的信息,得到表信息、SQL和相关的事务时序信息。
2.4 解决
a. 找到对应的代码逻辑,进行修改;
b. 找到慢sql的sessionid:trx_mysql_thread_id,杀死长时间执行的事务,避免阻塞其他事务。
```
kill trx_mysql_thread_id
```
- CentOS运维手册
- CentOS6.9挂载额外的磁盘
- ACL(access control list)-权限控制
- 普通用户不能绑定80端口
- ssh8.1p1编译步骤
- 制作openssh8_1的rpm包
- 离线yum源维护
- 去除VIM中打开文件里有的^M字符
- Mysql运维手册
- CentOS6.9搭建Mariadb-Galera集群
- mysql编码报错
- haproxy代理mysql galera
- 常用sql
- MySQL通用知识点
- 修复断电损坏的MySQL数据表
- sync_binlog配置的分析
- Xtrabackup备份与恢复
- Innodb线程并发同步机制
- redo log
- 死锁分析
- 慢SQL分析
- nginx运维手册
- nginx日志分割
- proxy_set_header作用
- nginx优化
- url末尾不加/
- 负载均衡
- haproxy和nginx研究
- haproxy配置
- redis运维手册
- redis_5.0.8集群搭建
- Redis集群原理分析
- predixy的安装和配置
- redis优化
- NFS运维手册
- flock操作失败
- mongodb运维手册
- MongoDB开启用户认证
- shell编码规范
- HTTP
- HTTP的传输编码
- 性能分析
- java内存分析
- javaCPU分析