1.现象:

最近两天在每天的凌晨0:15~20分左右收到报警短息,报警内容:

JDBC-SQL请求最近三分钟内平均耗时时间过高的报警,监控类型:SQL...

2.分析:

从现象来看

  • 每天凌晨15分,可能是定时任务

  • sql耗时,很可能是慢查询。根据关键字定位到这条语句

    <update id="initChance">
    UPDATE policychance SET chances=#{chances} WHERE pid=#{pid}
    </update>

3.验证:

  1. 该语句的被调用在com.xx.xxxxx.Provider#initPolicies.

    该方法是一个定时任务 @Scheduled(cron = "0 15 0/1 * * ?”),分析该任务的作用是每天初始化抽奖机会,一旦初始化完成通过设置标志位TASK_STAT_COMPLETE截流,所以当且仅当凌晨15分左右会出现报警。

  2. 分析该语句,我们看到where条件是pid=#{pid},pid字段只有一个组合索引,字段顺序(userid, pid),因为mysql最左前缀匹配的规则,该语句无法用到索引,而policychance表数据量庞大,约有1000W+,因此执行性能差,监控显示执行时间约26s。

4.解决方案:

根据对policychance表的使用情况来看,将索引字段顺序调整更合理。脚本如下

	USE xxxdb;
CREATE index ix_pid_user_id ON policychance (pid,user_id) ;
DROP INDEX ix_user_id_pid ON policychance;

5.然而:

too young!第二天凌晨依旧是报警,执行时间是有一点点的缩短(19s),但是为什么还是这么慢?我们忽略了使用索引最大的前提:索引列的数据离散度要足够的大!

SELECT count(DISTINCT pid) FROM policychance

policychance表的pid在一张1000W+的行中只有13个,离散度太低。在这种情况下,mysql引擎甚至会不使用索引。我们知道innodb存储引擎的索引类型是B+树,并不适用于这种情况。适用于这种情况的索引类型是位图索引(Bitmap index),目前mysql的存储引擎暂时还没有支持位图索引。ORACLE的位图索引介绍见这里

6.最终的解决方案:

问题终归是要解决的,只是不太优雅。分页查询满足条件的id,批量update。如果有好的处理方案,请留言告诉我,互相学习互相进步。

[mysql] 一次sql耗时高引发报警的分析和处理的更多相关文章

  1. (2)MySQL进阶篇SQL优化(show status、explain分析)

    1.概述 在应用系统开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产环境的影响也 ...

  2. MySQL优化之SQL耗时瓶颈 SHOW profiles

    1.首先查看是否开启profiling功能 SHOW VARIABLES LIKE '%pro%'; 或者 SELECT @@profiling; 2.开启profiling SET profilin ...

  3. MySQL 数据库SQL语句——高阶版本2

    MySQL 数据库SQL语句--高阶版本2 实验准备 数据库表配置: mysql -uroot -p show databases; create database train_ticket; use ...

  4. MySQL 数据库SQL语句——高阶版本1

    MySQL 数据库SQL语句--高阶版本 实验准备,数据表配置 mysql -uroot -p show databases; create database train_ticket; use tr ...

  5. 技术分析 | 浅谈在MySQL体系下SQL语句是如何在系统中执行的及可能遇到的问题

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 SQL语句大家并不陌生,但某种程度上来看,我们只是知道了这条语句是什么功能,它可 ...

  6. MySQL与NoSQL——SQL与NoSQL的融合

    来源:http://www.cnblogs.com/sunli/archive/2011/05/11/mysql-nosql.html 写这一篇内容的原因是MySQL5.6.2突然推出了memcach ...

  7. 深入解析 SQL Server 高可用镜像实现原理

    作者:郭忆 本文由 网易云 发布. SQL Server 是 windows 平台 .NET 架构下标配数据库解决方案,与 Oracle.MySQL 共同构成了 DB-Engines Ranking ...

  8. 【叶问】 MySQL常用的sql调优手段或工具有哪些

     MySQL常用的sql调优手段或工具有哪些1.根据执行计划优化   通常使用desc或explain,另外可以添加format=json来输出更详细的json格式的执行计划,主要注意点如下:     ...

  9. 深入解析SQL Server高可用镜像实现原理

    本文来自网易云社区 SQL Server 是windows平台.NET架构下标配数据库解决方案,与Oracle.MySQL共同构成了DB-Engines Ranking的第一阵营,在国内外企业市场中有 ...

随机推荐

  1. SSAS:菜鸟笔记(一)基本思路及操作

    建模思路 创建数据源 Data Source 创建数据源视图 Data Source View 创建数据维度 Dimenstrition 创建数据立方 Cube → 选定要填充的数据内容 Fact 向 ...

  2. square开源vim,tmux配置在linux上使用

    首先安装需要的软件 apt-get install vim ack-grep git tmux gnome-terminal ctags xclip silversearcher-ag 这里tmux需 ...

  3. 六款值得推荐的android(安卓)开源框架

    1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduli ...

  4. MeshCombineUtility.cs method `GetTriangleStrip' of type `UnityEngine.Mesh' could be found

    1) Assets/Standard Assets/Scripts/MeshCombineUtility.cs(27,74): error CS1061: Type `UnityEngine.Mesh ...

  5. Parallax.js – 自适应智能设备方向的视差效果插件

    Parallax.js 是一个简单的,轻量级的的视差引擎,能够对智能设备的方向作出反应.在没有没有陀螺仪或运动检测硬件可用的时候,使用光标的位置来代替.有很多的行为,你就可以设置为任何给定的视差实例. ...

  6. [git]git add 增加文件,文件名乱码

    使用git add添加要提交的文件的时候,如果文件名是中文,会显示形如 274\232\350\256\256\346\200\273\347\273\223.png 的乱码. 解决方案: 在bash ...

  7. Android 定时器

    Andorid定时器封装类 public class TimerUtil { private static final String TAG = "TimerUtil"; priv ...

  8. 2013/11/22工作随笔-缓存是放在Model层还是放在Controller层

    web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都 ...

  9. QCustomplot使用分享(一) 能做什么事

    一.QCustomPlot简介 之前在Qt之自绘制饼图这篇文章的说明中我简单的描述了下目前依赖于qt的第三方绘图库,此后我会针对自己使用QCustomPlot的情况做一总结,以方便大家参考 QCust ...

  10. 个人阅读作业Week17

      个人阅读作业Week17 reading buaa software   解决的问题 这是提出问题的博客链接:http://www.cnblogs.com/SivilTaram/p/4830893 ...