转自:

干货分享:MySQL之化险为夷的【钻石】抢购风暴 - Vanos_韩尛哲 - 博客园
http://www.cnblogs.com/Vanos-lcp/p/5642097.html

抢购钻石不稀奇,稀奇的是有钱赚不到,事情发生在2015年5月20日,大好的日子自然少不了商家的参与。即可为您还原现场,解决思路献给各位,请欣赏Show Time,everybody~

1、优化起因及工作准备

  2014年5月20日下午三点四十接到对方不愿意透漏姓名的“王大锤”领导的电话,对方火急火燎的仅提供了网站访问慢一条信息,当时博主那个心里一万只XX奔腾而过,俗话说的好,酒肉穿肠过,拿人钱财必替人消灾。

  对博主来说网站访问慢,首先不能乱了阵脚,先想到的就是看web、先看静态,如果静态ok就看动态,如果还不ok就看存储,再不行就看访问DB时长是否正常。此时原因就可以定位了。不会再有其他原因了。如果你太菜,那你可以把我的思路背过,相信对你来说是一个很好的帮助,此时一边与对方沟通更可能多的获得信息,可是对方一点都不懂,只好无能为力,与对方协商相关责任制后立即登录服务器(本人兼职XX钻世界集团技术顾问一职)。

  凭借个人经验查看web负载并不高,静态访问速度正常,由于线上活动正在进行,晚一分钟对商家即是损失,此时无法进行许多系统的排查,直接则判断是否是后端DB的问题?随登录DB查看负载。发现DB负载不正常,就没有进行其他的判断(什么IO看一下啊,内存看一下啊,网卡看一下啊,再看公司都倒闭了。),紧急恢复问题就是最大化的恢复问题,找到问题所在即刻解决问题。此时判断数据库有慢查询。

1 ================2015年5月20日 13:38:08日负载如下:================
2 [lcp@ZCdb01 ~]$ uptime
3 13:50:36 up 122 days, 21:51, 1 user, load average: 6.44, 5.76, 5.38
4
5 [lcp@ZCdb01 ~]$ uptime
6 13:51:38 up 122 days, 21:22, 1 user, load average: 8.01, 6.30, 5.58

2、判断问题所在 

 随登录数据库show full processlist;此工具运维人员必备,干了几年的运维别说你不会。不会的话看了我的博客也应该会了。

连抓了两遍之后发现,这一堆东西不动啊,前面排着的update被锁定,想写还写不进去。select过多,读也读不出来。

1 mysql> show processlist;
2 +----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+

3、定位待优化语句

再返回来看后面的查询语句是通过三个条件进行查询的。于是定位了待优化的语句也就是下方的select出现次数最多的语句

                         ↑↑↑查询语句如上↑↑↑

  随后抓出一条命令explain,多次确认后加SQL_NO_CACHE不让其走缓存再反复确认,最终判断次语句没有建立索引或走索引,共查阅7万3千多条数据耗时惊人。

1 mysql> select SQL_NO_CACHE id from **_**_detail where ader='**_**-jazz_flash' and dateline='**_**' and pos='**_**';

  此时看到可能走的索引和索引都是不存在的。独立奔跑在七万多条语句中

1 possible_keys:NULL
2
3         key:NULL
4
5       rows:71328  #接近全盘扫描

  我记得这台机器是戴尔服务器2850很老的一台服务器,但这很明显不是硬件问题,随问对方的主管,有没有人对这台机器进行优化,一边电话询问一边进行查看,去证实自己的想法,使用show查看表结构show create table **_**_detai\G,果不其然,除了主键索引,一个索引都没有建立(为这台年老失修的服务器感到骄傲,它竟然扛了那么久授小弟一拜)。

4、解决方案

  扯淡归扯淡我们继续,此时已耗时3分钟,建立索引的规则相信大家也都清楚,此处不过多解释,一会看总结。得到以上结论后,查看哪一字段列的唯一值数量较多。使用select count(distinct XX)from **_**_detai;以上三个语句都使用次等命令查看,最后发现三列的数值为766/531/154都不高,原因是有一列是日期,它的唯一值是最少的,第二列看不懂。。

  再使用select count(*) from **_**_detail;命令查看一下总数量达到了七万多条的数量。

  根据以上的情况,而且查询语句里面也很特殊都是等号。这种情况下建立索引就容易走索引。这种情况下考虑走联合索引。根据以上信息及咨询研发经理其他语句的情况下,创建如下索引:

1 mysql> create index d_a_p on **_**_detail(dateline,daer(20),azz(10),pos(20));

  语句的查询顺序是询问的研发经理,因为联合索引有前缀生效的特性,所以此时确定了索引之后并没有直接创建,而是与研发经理协商,此时需要杀掉几个读的请求。在前面选几个。show proacesslist;update根据业务需求去考虑。谨慎使用至于杀掉的方法..kill+id相信没几个不会的吧。

  索引建立完成再使用explain查看索引是否生效,然后同样还是使用select+SQL_NO_CACHE参数不走缓存查询语句。发现此时仅扫描了12条语句,查询时间更是少之又少。

  再次使用show proacesslist;查看mysql线程,几乎看不到了。说明效果很明显。

  

5、解决效果

  优化之后的负载,已经从之前的6.x、8.x慢慢下降为2.x,1.72,五分钟后降到了0.07、0.21的正常值

 1 [lcp@ZCdb01 ~]$ uptime 2  13:59:09 up 120 days,  21:29,  2 users,  load average: 2.40, 4.62, 5.093 [lcp@ZCdb01 ~]$ uptime 4  13:59:29 up 120 days,  21:29,  2 users,  load average: 1.72, 4.32, 4.985 [lcp@ZCdb01 ~]$ uptime 6  13:59:30 up 120 days,  21:29,  1 users,  load average: 1.66, 4.26, 4.957 [lcp@ZCdb01 ~]$ uptime 8  14:05:27 up 120 days,  21:35,  1 users,  load average: 0.07, 1.39, 3.429 [lcp@ZCdb01 ~]$ uptime
10  14:05:35 up 120 days,  21:36,  1 users,  load average: 0.21, 1.38, 3.40

6、总结

   问题判断+解决时长10分钟以内

优化判断+后期观察15分钟左右

此次问题解决总用时25分钟左右

   此次问题由于对方对mysql数据库优化不到位,此公司并无相关技术人员,日常维护工作无法正常开展,导致突发状况访问异常。为保证以后服务器正常工作,优化完成后在配置文件(my.cnf)下添加如下参数记录慢查询语句。

1   long_query_time =2 #<==超过2秒,记录到LOG里。
2
3   log_queries_not_using_indexes #<==没有走索引的语句,记录到LOG里。
4
5   log-slow-queries = /data/3306/slow.log #<==LOG文件

  但是建立索引的前提是,生产场景,表中数据多的情况下及高峰期不能建立索引,例如:300万记录。由于此次问题解决中使用的是联合索引,联合索引的特性是前缀生效,这也是有别于其他索引,所以创建时更为谨慎,需要与开发共同商议创建规则。否则索引无效。

  关于mysql的优化从此次解决问题的过程中得出以下几个结论:

  1、紧急情况抓慢查询SQL语句:

    登录数据库

    show full prcesslist;

  2、未雨绸缪:重要不紧急:分析慢查询日志。(生成日志方法在上述总结中有具体参数)

    分析慢查询SQL语句,每天定时发邮件给相关工作人员,核心开发、高级运维或DBA

    每天切割慢查询日志,去重分析后发给大家。

         切割方法:

              1)mv ,relaod进程。2)cp,>清空

              2)利用定时任务

  以上分享内容到此结束,如有疑问欢迎发送邮件到lcp779401@cntv.cn探讨交流,希望对大家有所帮助。

转载于:https://www.cnblogs.com/paul8339/p/5642519.html

干货分享:MySQL之化险为夷的【钻石】抢购风暴【转载】相关推荐

  1. Oracle 数据怎么实时同步到 MySQL | 亲测干货分享建议收藏

      摘要: 这段时间负责一个老项目开发的数据库管理工作,这个项目中开发库与测试数据库分离,其中有些系统表数据与基础资料数据经常需要进行同步,相信很多 DBA 同学经常会遇到要从一个数据库实时同步到另一 ...

  2. dm7和mysql_【干货分享】达梦数据库DM7的新特性发布啦

    原标题:[干货分享]达梦数据库DM7的新特性发布啦 近日,DM7正式发布新特性.作为一款广受业内人士认可的国产数据库产品,最突出的特征就是它良好的兼容性,完善的功能以及超出客户期望的优秀性能表现:本次 ...

  3. Oracle 数据怎么实时同步到 Kafka | 亲测干货分享建议收藏

     摘要: 很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.我自己亲测了一种方式,可以非常方便地完成 Oracl ...

  4. Oracle 数据怎么实时同步到 SQL Server | 亲测干货分享建议收藏

    摘要: 很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.我自己亲测了一种方式,可以非常方便地完成 Oracle ...

  5. Oracle 数据怎么实时同步到 PgSQL | 亲测干货分享建议收藏

    摘要: 这段时间负责一个老项目开发的数据库管理工作,这个项目中开发库与测试数据库分离,其中有些系统表数据与基础资料数据经常需要进行同步,相信很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数 ...

  6. Oracle 数据怎么实时同步到 MongoDB | 亲测干货分享建议收藏

    摘要: 很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.我自己亲测了一种方式,可以非常方便地完成 Oracle ...

  7. abap 取日期最大_Pointer干货分享:SQL面试50题思路解答与分类整理(下)CASE与日期函数...

    这是POINT小数点的第 368篇文章点点写在前面:SQL技能是数据分析师面试中必不可少的环节,小数点数据社区也给大家提供了练习SQL题目的地方,以下是pointer Yongfan整理的SQL50题 ...

  8. 让0基础纯小白也能上手写Python,干货分享(二)

    上一篇文章测试工程师进阶之Python学习干货分享分享了Python基础知识,本次继续分享其它内容. 一.Python基本数据类型 1.数值类型:整数.浮点数.复数. 2.序列类型:字符串.列表.元组 ...

  9. 【Linux服务器开发系列】详解多线程网络编程丨百分百干货分享丨学到就是赚到

    90分钟搞懂多线程网络编程模型 1. 网络编程关注的问题 2. 网络编程的几种模型reactor,one loop per thread及其变种 3. skynet,redis,nginx,memca ...

  10. 报道 | 本科4篇顶会论文如何做到?清华特奖干货分享:我是这样写论文、做实验、与导师相处...

    ↑↑↑↑↑点击上方蓝色字关注我们! 『视学算法』转载 作者:量子位 编者按: 清华本科特奖获得者.清华计算机大四学生高天宇的顶会论文干货分享,手把手教你打开本科生/嗑盐小白科研之门的门钥匙. 本科生, ...

最新文章

  1. java怎么复制动态数组_Java 数组排序复制等操作(Java Arraycopy)
  2. 蚂蚁爬杆问题php,PHP实现的蚂蚁爬杆路径算法代码_php技巧
  3. EC20模块、主机休眠唤醒机制
  4. myeclipse如何修改tomcat的timeout
  5. hdu-acm steps FatMouse's Speed
  6. kafka-manager安装
  7. solverstate的使用
  8. apache.camel_Apache Camel 2.21发布–新增功能
  9. python selenium T3
  10. 汇编语言---函数调用栈
  11. Centos 6.5 X64 环境下编译 hadoop 2.6.0 --已验证
  12. php格式化输出字_PHP 输出格式化字符串
  13. nopcommerce笔记3 还可以控制什么
  14. cookie 设置有效期 检测cookie
  15. 编码的奥秘:自动操作
  16. steam,epic,origin限免游戏推送,持续更新
  17. python查看qq撤回消息_QQ坦白说里匿名叫我还想逃?Python轻松查看匿名用户信息...
  18. html表格 超链接无效,excel表格超链接失效的解决方法
  19. linux命令kp使用方法,Linux 命令 使用
  20. 计算机专业英语期末考试,《计算机专业英语》期末试卷

热门文章

  1. C语言:编写一个程序,从键盘读入一个矩形的两个边的值(整数),求矩形面积
  2. 图片base64编码显示
  3. 【技术分享】BurpSuite 代理设置的小技巧
  4. 微信小程序如何突破模板消息限制,获取多个formId?
  5. 在使用Git提交代码的时候犯了个低级错误
  6. 研究理解lanproxy实现内网穿透
  7. 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件
  8. MySQL生产库主从重新同步操作注意事项
  9. CentOS 6.5 安装 java 环境
  10. 浅谈C#中的延“.NET研究”迟加载(2)——善用virtual