生产环境遇到几个YearningSQL平台触发的慢查询(该sql产生的笛卡尔积太大,出不来结果,研发在前端界面再次触发查询),最终把数据库的CPU拖高的情况。
DBA紧急介入后,根据mysql服务器上show full processlist抓取到相关sql,执行时间已经超过120s。先记录下现场,然后kill掉相关query。
query类似如下:
对比了下后台操作日志,确认这就是研发同学在YearningSQL查询界面多次提交的query。
但是,我们几个月前就上线了pt-kill 定时任务,针对于YearningSQL平台的用户查询做了60秒的查询超时熔断。理论上即便出现这类慢sql也不会执行时间过长。
查了下pt-kill 的最近日志,发现里面有一些提示:
Wide character in print at pt-kill line 7373
翻下对应的代码段,如下部分:
根据上面的sql,基本可以判断是perl脚本执行过程中遇到中文字符处理失败导致的。
找到了原因,解决方法也很简单:
另外对于一些复杂的查询,有些建议给到研发同学:
1、执行前建议先explain自行评估下
2、查询中,可以显式定义60秒超时时间,例如 SELECT /*+ MAX_EXECUTION_TIME(60000) */ * FROM t1 INNER JOIN t2 WHERE ... 【5.7及以上版本生效】