实用QPS和TPS高的高效分析方法

 现在主库的MySQL的QPS一直在3K/s左右,想知道其到底执行了那些SQL,或者是那些SQL执行的次数比较多:

  腾讯云的后台监控:

    开启腾讯云的SQL审计后,下载几分钟SQL日志文件, 下列语句在MySQL建表,如我们下载了6分钟的单实例审计日志:   

CREATE TABLE `ex` (
  `AffectRows` varchar(255)  DEFAULT NULL,
  `ErrCode` varchar(255)  DEFAULT NULL,
  `SqlType` varchar(255)  DEFAULT NULL,
  `TableName` varchar(255)  DEFAULT NULL,
  `PolicyName` varchar(255)  DEFAULT NULL,
  `DBName` varchar(255)  DEFAULT NULL,
  `Sql` text CHARACTER SET utf8mb4,
  `Host` varchar(255)  DEFAULT NULL,
  `User` varchar(255)  DEFAULT NULL,
  `ExecTime` varchar(255)  DEFAULT NULL,
  `CpuTime` varchar(255)  DEFAULT NULL,
  `LockWaitTime` varchar(255)  DEFAULT NULL,
  `CheckRows` varchar(255)  DEFAULT NULL,
  `SentRows` varchar(255)  DEFAULT NULL,
  `ThreadId` varchar(255)  DEFAULT NULL,
  `NsTime` varchar(255)  DEFAULT NULL,
  `IoWaitTime` varchar(255)  DEFAULT NULL,
  `TrxLivingTime` varchar(255)   DEFAULT NULL,
  `Timestamp` varchar(255)  DEFAULT NULL,
  `Result` varchar(255)  DEFAULT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `idx_sql` (`Sql`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
View Code

  将sql文件导入到表中,执行下列SQL:

select tab,op,count(*) num from (
select case when `sql` like 'insert%' then 'insert'
when `sql` like 'replace%' then 'replace'
when `sql` like 'update%' then 'update'
when `sql` like 'delete%' then 'delete'
when `sql` like 'select%' then 'select' else '' end op,
case when `sql` like 'insert%' then substring_index(substring_index(LOWER(`sql`), '(', 1),'into',-1)
when `sql` like 'replace%' then substring_index(substring_index(LOWER(`sql`), '(', 1),'into',-1)
when `sql` like 'update%' then substring_index(substring_index(LOWER(`sql`), 'set', 1),'update',-1)
when `sql` like 'delete%' then substring_index(substring_index(LOWER(`sql`), 'where', 1),'from',-1)
when `sql` like 'select%' then substring_index(substring_index(LOWER(`sql`), 'where', 1),'from',-1) 
else '' end tab,`sql` from ex where `sql` like 'insert%' or `sql` like 'update%' or `sql` like 'delete%' or `sql` like 'select%' or `sql` like 'replace%' ) t GROUP BY tab,op order by 3 desc

执行结果:

 

 

 初步得到执行排序,初步计算其QPS:

    前2个查询命令,QPS =550000/60/6=1527次/秒,其每秒3000多次/秒,这2个查询占用几乎一半左右,大体知道其SQL调用情况。

    如果要查某个表可以使用全文索引:     

--查询sys_user表,没有join关联字段,有"select"查询关键字的SQL
select * from ex where MATCH(`sql`) AGAINST ('+sys_user -join +select' IN BOOLEAN MODE); 

  如果id参数是一样的,就有多少重复的id(1060),后面就可以直接加redis缓存:  

select * from ex where MATCH(`sql`) AGAINST ('+sys_user -join +select' IN BOOLEAN MODE) 
and MATCH(`sql`) AGAINST ('1060')

  立马就可以查询到明细情况。

  这里查询了增删改查,如果只查TPS,可以把SQL查询语句的 " or `sql` like 'select%' "  去掉,就可以查DML的调用次数

  总结:

     1,该方法在百万级别(千万级也可以)的SQL审计中,能快速分析出哪个表的调用表次数多

     2,结合mysql的fullindex全文索引,快速定位到具体的SQL

     3,主要用来分析QPS高的原因

 

posted @ 2021-11-24 16:15  zping  阅读(813)  评论(0编辑  收藏  举报