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


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

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

文章插图
 
95 分位的 sql 慢查询耗时约在 60s 左右
 
9、锁等待时间
MySQL慢查询风险指数模型设计

文章插图
 
95分位的慢查询锁等待时间约为0.00629s
 
10、扫描行数
MySQL慢查询风险指数模型设计

文章插图
 
95分位的慢查询扫描行数约为1785w行
 
11、查询次数
MySQL慢查询风险指数模型设计

文章插图
 
95分位的慢查询次数约为180个
 
12、发送流量
 
由于流量字段缺失 , 暂时不计入评分系统 。
 
13、计分项边界值
MySQL慢查询风险指数模型设计

文章插图
 
14、计分模型
 
每一项计分项的边界得以确认 , 值越大分数越高 。但是存在以下情况:
 
某些评分项的值对系统的影响程度并不是成正比例 , 超过某个临界点 , 对系统的压力会迅速增长 。
 
比如:查询次数 , 一条超时为1s的sql , 查询1次、查询10次、查询100次 , 对系统的压力是不一样的 , 量变会引发质变 。
设计有一下四种计分模型:
MySQL慢查询风险指数模型设计

文章插图
 
计分代码如下:
 
/** * @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则返回0return 0}if val >= maxVal { // 如果值超过上边界 , 则设置为最大分数return maxScore}if val <= minVal { // 如果值低于下边界 , 则设置为最小分数return minScore}var scoreRatio float64switch calWay {case "likeSin": // 类正弦曲线// Y = a + b·X + c·X2 + d·X3 + e·X4 + f·X5b := 0.0547372760360247c := -0.0231045458864445d := 0.00455283203705563e := -0.000281663561505204f := 5.57101673606083e-06// 使用20个函数绘制点位拟合出来的ratio := (val - minVal) / (maxVal - minVal) * 20scoreRatio = 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 scoreRatiodefault: // 默认是正比例scoreRatio = (val - minVal) / (maxVal - minVal)}return scoreRatio * (maxScore - minScore)} 
模型曲线如下:
MySQL慢查询风险指数模型设计

文章插图
 
我们期望某些计分项在各个不同的阶段对分数的影响是不一样的 , 故首先假设计分模型和权重如下:
MySQL慢查询风险指数模型设计

文章插图
 
整体的评分模型如下:
 
慢查询风险指数 = sum(func(慢查询评分项) * 权重)ps:风险指数总分数上限为100 
MySQL慢查询风险指数模型设计

文章插图
 
五、测试
 
1、测试一
 
1)权重分配
MySQL慢查询风险指数模型设计

文章插图
 
2)计算结果数据分布
MySQL慢查询风险指数模型设计

文章插图
 
3)样本SQL分析
MySQL慢查询风险指数模型设计


推荐阅读