合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
1.开启慢SQL日志 ``` slow_query_log 慢查询开启状态 slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录) long_query_time 查询超过多少秒才记录 ``` 2.问题分析 利用explain指令获得该SQL语句的执行计划,根据该执行计划,可能有两种场景。 * SQL不走索引或扫描行数过多等致使执行时长过长。 * SQL没问题,只是因为事务并发导致等待锁,致使执行时长过长。 **场景一 ** 2.1 优化SQL 通过增加索引,调整SQL语句的方式优化执行时长, 例如下的执行计划: ![](https://img.kancloud.cn/72/2b/722b269f6099335f0515cb068751d964_1080x76.png) 该SQL的执行计划的type为ALL,同时根据以下type语义,可知无索引的全表查询,故可为其检索列增加索引进而解决。 ![](https://img.kancloud.cn/13/66/1366154e09028572828f047a983c6832_1076x516.png) **场景二** 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 ```