大家都知道,slow query系统做的好不好,直接决定了解决slow query的效率问题
一个数据库管理平台,拥有一个好的slow query系统,基本上就拥有了解锁性能问题的钥匙
但是今天主要分享的并不是平台,而是在平台中看到的奇葩指数五颗星的slow issue
好了,关子卖完了,直接进入正题
一、症状
一堆如下慢查询
# User@Host: cra[cra] @ [xx] Id: 3352884621
# Query_time: 0.183673 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
use xx_db;
SET timestamp=1549900927;
# administrator command: Prepare;
# Time: 2019-02-12T00:02:07.516803+08:00
# User@Host: cra[cra] @ [xx] Id: 3351119968
# Query_time: 0.294081 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
SET timestamp=1549900927;
# administrator command: Prepare;
从我们的监控图上可以看到,每天不定时间段的slow query 总数在攀升,但是却看不到任何query 语句
这是我接触到的slow query优化案例中从来没有过的情况,比较好奇,也比较兴奋,至此决心要好好看看这个问题
二、排查
要解决这个问题,首先想到的是,如何复现这个问题,如何模拟复现这个症状
MySQL客户端 模拟prepare
* 模拟
root:xx> prepare stmt1 from 'select * from xx_operation_log where id = ?';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
* 结果
# Time: 2019-02-14T14:14:50.937462+08:00
# User@Host: root[root] @ localhost [] Id: 369
# Query_time: 0.000105 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
SET timestamp=1550124890;
prepare stmt1 from 'select * from xx_operation_log where id = ?';
结论是: MySQL client 模拟出来的prepare 并不是我们期待的,并没有得到我们想要的 administrator command: Prepare
perl 模拟prepare
#!/usr/bin/perl
use DBI;
my $dsn = "dbi:mysql:database=${db_name};hostname=${db_host};port=${db_port}";#数据源
#获取数据库句柄
my $dbh = DBI->connect("DBI:mysql:da