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. Javascript类继承-机制-代码Demo【原创】

    最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...

  2. keil l251 command summary --Lib

    keil l251 command summaryLIB251 LIST MYLIB.LIB TO MYLIB.LST PUBLICS LIB251 EXTRACT MYLIB.LIB (GOODCO ...

  3. 用Jekyll在github上写博客——《搭建一个免费的,无限流量的Blog》的注脚

    本来打算买域名,买空间,用wordpress写博客的.后来问了一个师兄,他说他是用github的空间,用Jekyll写博客,说很多人都这么做.于是我就研究了一下. 比较有价值的文章有这么几篇: htt ...

  4. SQL截取字段字符串的方法

    set @str='WX15-53-H-53-99-15-335-23'; select @str as '字符串' select len(@str) as '字符长度' select charind ...

  5. Android UI开发第四十篇——ScrollTricks介绍

    ScrollTricks是一个开源控件,实现了两个简单功能: 1.Quick Return:向上滑动时,View也向上滑动并且消失,当向下滑动时,View马上出现.例如Google Now的搜索功能. ...

  6. 使用 Responsive Elements 快速构建响应式网站

    Responsive Elements 可以使任何元素来适应和应对他们所占据的区域.这是一个轻量的 JavaScript 库,你可以轻松嵌入到你的项目.元素会更具自己的宽度,自动响应和适应空间的增加或 ...

  7. iOS-UIButton-设置button标题和图片位置

    一.效果图 1.Button被点击之前 2.Button被点击之后 二.代码 - (void)createBtn3 { UIImage * buttonImage = [UIImage imageNa ...

  8. 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】

    最近一直用ASP.NET MVC 4.0 +LINQ TO SQL来开发设计公司内部多个业务系统网站,在这其中发现了一些问题,也花了不少时间来查找相关资料或请教高人,最终都还算解决了,现在我将这些问题 ...

  9. Sprint第三个冲刺(第四天)

    一.Sprint介绍 任务进度: 二.Sprint周期 看板: 燃尽图:

  10. Qt Style Sheet实践(一):按钮及关联菜单

    导读 正如web前端开发中CSS(Cascade Style Sheet)的作用一样,Qt开发中也可以使用修改版的QSS将逻辑业务和用户界面进行隔离.这样,美工设计人员和逻辑实现者可以各司其职而不受干 ...