干货分享:MySQL之化险为夷的【钻石】抢购风暴
抢购钻石不稀奇,稀奇的是有钱赚不到,事情发生在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 [[email protected] ~]$ uptime 3 13:50:36 up 122 days, 21:51, 1 user, load average: 6.44, 5.76, 5.38 4 5 [[email protected] ~]$ 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,果不其然,除了主键索引,一个索引都没有建立(为这台年老失修的服务器感到骄傲,它竟然扛了那么久授小弟一拜)。