MySQL慢查询风险指数模型设计(2)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL慢查询风险指数模型设计

评分模型可以简单描述为:


score=sum(评分项*权重)

选取评分项边界

评分模型的评分项确认之后,为了防止单项分数过高,需要对评分项进行百分化,并且所有权重总和为 100 ,根据评分项计分模型可以算出符合增长曲线的分数,这样评分模型计算出来的总分数为 100 ,故需要确认每项的分数边界、权重、计分模型。只有各项的边界、权重、计分模型确认之后,给定一个慢查询,评分模型才能计算出合理的分数。评分项的边界可以根据当前历史数据设置。计分模型和权重可以首先进行假设,测试完成之后如果不符合预期则修改权重、计分模型,并重复测试-修改过程,直至测试结果符合预期。

边界选取标准

根据当前慢查询的历时记录,由于极值数据可能会存在干扰,导致真实值失真,故需要去除最高部分 5% 的异常值,将 95 分位的值作为每个评分项的最高边界。如果单项值超过最高边界的值评分项,单项分数都将被设置为最大分数。

查询时间:

95 分位的 sql 慢查询耗时约在 60s 左右

锁等待时间

95分位的慢查询锁等待时间约为0.00629s

扫描行数

95分位的慢查询扫描行数约为1785w行

查询次数

95分位的慢查询次数约为180个

发送流量

由于流量字段缺失,暂时不计入评分系统。

计分项边界值

计分模型

每一项计分项的边界得以确认,值越大分数越高。但是存在以下情况:

某些评分项的值对系统的影响程度并不是成正比例,超过某个临界点,对系统的压力会迅速增长。

比如:查询次数,一条超时为1s的sql,查询1次、查询10次、查询100次,对系统的压力是不一样的,量变会引发质变。
设计有一下四种计分模型:

计分代码如下:

/**
 * @Description: 计算单项得分,分数介于最小分数和最大分数之间,可选的计分模型有:类正弦模型、正弦模型、指数模型、正比例模型
 * @Param val: 单项当前值
 * @Param minVal: 单项最小值
 * @Param maxVal: 单项最大值
 * @Param minScore: 单项最小得分
 * @Param maxScore: 单项最大得分
 * @Param calWay: 计分模型方式
 * @Return float64: 单项得分
 */
func calSingleScore(val, minVal, maxVal, minScore, maxScore float64, calWay string) float64 {
   if maxVal == 0 { // 如果值为0则返回0
      return 0
   }
   if val >= maxVal { // 如果值超过上边界,则设置为最大分数
      return maxScore
   }
   if val <= minVal { // 如果值低于下边界,则设置为最小分数
      return minScore
   }
   var scoreRatio float64
   switch calWay {
   case "likeSin": // 类正弦曲线
      // Y = a + b·X + c·X2 + d·X3 + e·X4 + f·X5
      b := 0.0547372760360247
      c := -0.0231045458864445
      d := 0.00455283203705563
      e := -0.000281663561505204
      f := 5.57101673606083e-06
      // 使用20个函数绘制点位拟合出来的
      ratio := (val - minVal) / (maxVal - minVal) * 20
      scoreRatio = b*ratio + c*(ratio*ratio) + d*(ratio*ratio*ratio) +
         e*(ratio*ratio*ratio*ratio) + f*(ratio*ratio*ratio*ratio*ratio)
   case "sin": // 正弦曲线
      ratio := (val - minVal) / (maxVal - minVal)
      scoreRatio = math.Sin(math.Pi / 2 * ratio)
   case "exponent": // 指数曲线
      ratio := (val - minVal) / (maxVal - minVal)
      a := math.Log2(maxScore - minScore)
      scoreRatio = math.Pow(2, a*ratio)
      return scoreRatio
   default: // 默认是正比例
      scoreRatio = (val - minVal) / (maxVal - minVal)
   }
   return scoreRatio * (maxScore - minScore)
}


模型曲线如下:















































         
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
119 0
|
1月前
|
SQL 监控 关系型数据库
深入理解MySQL日志:通用查询、慢查询和错误日志详解
深入理解MySQL日志:通用查询、慢查询和错误日志详解
136 0
|
7月前
|
关系型数据库 MySQL 索引
mysql之开启慢查询日志
mysql之开启慢查询日志
|
8月前
|
SQL 关系型数据库 MySQL
flask中生成迁移脚本并将orm模型映射至MySQL
flask中生成迁移脚本并将orm模型映射至MySQL
122 0
|
7月前
|
SQL 监控 关系型数据库
【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】
【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】
498 0
|
1月前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
105 1
|
6月前
|
SQL 关系型数据库 MySQL
07 Django模型 - ORM简介及MySQL数据库的使用
07 Django模型 - ORM简介及MySQL数据库的使用
39 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL - 慢查询优化
MySQL - 慢查询优化
|
4月前
|
SQL 关系型数据库 MySQL
MySQL SQL性能分析 慢查询日志、explain使用
MySQL SQL性能分析 慢查询日志、explain使用
121 0
|
5月前
|
SQL 存储 关系型数据库
②⑩ 【MySQL Log】详解MySQL日志:错误日志、二进制日志、查询日志、慢查询日志
②⑩ 【MySQL Log】详解MySQL日志:错误日志、二进制日志、查询日志、慢查询日志
81 0

推荐镜像

更多