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. 让Windows 7变成WIFI热点

    360要推便携路由器,个人觉得其主要目的是盯住了用户无线设备上的信息.因为如果用户移动设备都通过它这个路由器走的话,未加密的数据全部在他掌控之中. 其实Windows 7以上的系统是非常容易建立无线热 ...

  2. ios面试技术要点

    iOS面试 技术总结点(可参考):多线程 运行时 runloop app框架 几种动画编程 jsonmodel原理 sdwebimage原理 masonry怎么应用及原理 应用框架有哪些 说一下Fac ...

  3. There is no mode by that name loaded / mode not given 产生原因(个案)

    使用jQM DateBox用于界面显示日期选择控件,结果发现之前是正常的.今天用就不行啦.提示There is no mode by that name loaded / mode not given ...

  4. 拼音 名字 排序 a-z的比较 ( sortUsingComparator )

    NSMutableArray * array = [NSMutableArrayarrayWithObjects:@"ad",@"az",@"ac&q ...

  5. 【eoe 6】ActionBar的使用

    一. Action Bar 一般位于屏幕顶部,包括四个可操作区域: 应用图标或LOGO区域,用于视图控制的Spinner下拉菜单或TAB控件区域, Action button(也称为Action It ...

  6. JS基础回顾,小练习(克隆对象,数组)

    对象的克隆: var srcObj = { a: 1, b: { b1: ["hello", "hi"], b2: "JavaScript" ...

  7. 关于js中的几个小问题。

    问题1: 使用连续赋值后面的变量会成为全局对象的一个属性,并且这个属性可以通过delete删除. 原因:赋值语句是从右往左执行的,我们将10赋值给了c,但是c此时还声明,接着把c的返回值赋值给了b,但 ...

  8. codeforce A. Design Tutorial: Learn from Math

    题意:将一个数拆成两个合数的和, 输出这两个数!(这道题做的真是TMD水啊)开始的时候不知道composite numbers是啥意思,看了3遍才看懂.... 看懂之后又想用素数筛选法来做,后来决定单 ...

  9. SQL Server里因丢失索引造成的死锁

    在今天的文章里我想演示下SQL Server里在表上丢失索引如何引起死锁(deadlock)的.为了准备测试场景,下列代码会创建2个表,然后2个表都插入4条记录. -- Create a table ...

  10. [Architect] Abp 框架原理解析(1) Module

    本节目录 Abp介绍 Abp源码分析 代码实现 Abp介绍 学习了一段时间的Abp,领略了一下前辈的架构.总结还是SOLID,降低耦合性. 虽然从架构上说甚至不依赖于DI框架,但实际上在基础框架中还是 ...