zoukankan      html  css  js  c++  java
  • 实用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); 

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

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

      总结:

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

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

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

  • 相关阅读:
    Oracle SQL Developer 设置自动提示(完成设置)
    访问控制修饰符
    BigDecimal.valueOf
    Use try-with-resources
    python学习之字符编码
    python语法:
    python学习之环境搭建 输入输出
    C51存储的优化
    c51中的bit,SBIT
    关于IO模拟时序(SPI)的注意事项
  • 原文地址:https://www.cnblogs.com/zping/p/15597035.html
Copyright © 2011-2022 走看看