如何不让一个慢查询把服务器搞冒烟

原创 2016年08月31日 14:39:10

手机API接口如何抗住高并发

前段时间项目迎来七夕高峰,有一个接口的SQL本来长这样:

mysql> explain SELECT *,sum(num) AS sum FROM bi_search WHERE search_time >= '2016-08-30' AND type = 0 AND state = 1 GROUP BY keyword ORDER BY sum DESC LIMIT 50;
+----+-------------+-----------+------+--------------------------+------+---------+-------+--------+----------------------------------------------+
| id | select_type | table     | type | possible_keys            | key  | key_len | ref   | rows   | Extra                                        |
+----+-------------+-----------+------+--------------------------+------+---------+-------+--------+----------------------------------------------+
|  1 | SIMPLE      | bi_search | ref  | type,search_time,keyword | type | 2       | const | 651114 | Using where; Using temporary; Using filesort |
+----+-------------+-----------+------+--------------------------+------+---------+-------+--------+----------------------------------------------+

search_time,type,state都建了索引,typestate取值范围有限,所以基本没啥用,主要是靠search_time,但是explain的结果表示并没有用到有效索引,实际情况下表里有130w+数据的时候这个语句跑起来平均耗时5s多,这肯定是不能忍受的。

那强制索引怎么样?试试看:

mysql> explain SELECT *,sum(num) AS sum FROM bi_search FORCE INDEX (search_time) WHERE search_time >= '2016-08-30' AND type = 0 AND state = 1 GROUP BY keyword ORDER BY sum DESC LIMIT 50;
+----+-------------+-----------+-------+---------------------+-------------+---------+------+--------+---------------------------------------------------------------------+
| id | select_type | table     | type  | possible_keys       | key         | key_len | ref  | rows   | Extra                                                               |
+----+-------------+-----------+-------+---------------------+-------------+---------+------+--------+---------------------------------------------------------------------+
|  1 | SIMPLE      | bi_search | range | search_time,keyword | search_time | 4       | NULL | 290616 | Using index condition; Using where; Using temporary; Using filesort |
+----+-------------+-----------+-------+---------------------+-------------+---------+------+--------+---------------------------------------------------------------------+

有效果,rows降到29w,照理说在29w里面怎么查都不会太慢,但是explain里的rows只是个参考,实际跑起来还是花了3s多,也是不能忍受的。

这台数据库的机器同时还跑其他业务,都是量级较大的,服务器负载本来就不低,七夕还没到,就因为这条sql把服务器搞的直冒烟,本业务慢查询也拖慢了其他业务的执行时间导致连锁反应。

之前已经对数据的读取部分加了缓存,但是日志记录还是显示某段时间内产生大量的慢查询请求。开始我们怀疑是缓存失效,但后来发现,其实是高并发导致在设置缓存阶段,由于sql语句执行时间太长,导致在这5秒内造成大量

直接说解决方案吧:

  1. 缩小查询范围,由之前的查询3天改为查询1天,量级降到130w+数据
  2. 强制使用索引,一定程度上缩短查询时间。
  3. 写个脚本,定时将查询结果保存到memcache里,这个主要是防止高并发情况下,等待写入mc时造成短时间大量数据库访问
  4. 对数据库读取结果做缓存
  5. 对接口结果做缓存
版权声明:本文为博主原创文章,未经博主允许不得转载。

终于把服务器搞好了...

终于把服务器搞好了...          领导发话,今天必须把服务器搞好,服务器上有OA\FTP\MAIL\WEB等服务,可是硬件是P3-800、256Mb的配置,真不知道它能坚持多长时间。不...
  • hemeng
  • hemeng
  • 2014年02月19日 19:14
  • 628

MySQL慢查询的定位与优化

参考链接:http://orangeholic.iteye.com/blog/1700509 英文链接:https://www.dreamhost.com/blog/2013/08/19/mysql...
  • u010689306
  • u010689306
  • 2016年06月05日 23:11
  • 647

优化慢执行或慢查询的方法

1、查询如果慢的建立索引可以提升速度相当于就是之前一个表数据量比较小,之后数据量大了查询就变慢,此时在经常用到的字段上加个索引,效率会翻倍很多的2、建立索引是为了提升速度,所以避免对索引字段进行计算或...
  • u011944141
  • u011944141
  • 2016年06月22日 20:29
  • 1481

每日构建和冒烟测试

每日构建和冒烟测试 (2006-08-01 12:43:15) 转载▼   分类:软件生命周期 谈每日构建都会连带谈冒烟测试这个词。每日构建不是简单的...
  • qt_learn
  • qt_learn
  • 2014年07月30日 15:43
  • 674

hdu-1286-找新朋友

找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub...
  • qq_18062811
  • qq_18062811
  • 2014年08月18日 15:09
  • 685

【mysql】监控数据库和抓取慢查询的几种方法汇总

监控mysql情况,并抓取慢查询 监控方法: 采用第三方工具spotlight、MONyog、HP sitescope(注:spotlight需在数据库中安装MDA表) 查看mysql的情况: sho...
  • zouxiongqqq
  • zouxiongqqq
  • 2013年06月27日 14:06
  • 1522

MySQL如何快速定位慢查询的语句

①首先了解MySQL数据库的运行状态查询情况         使用命令show [session|gobal] status       例子:show status like 'uptime';...
  • u010061734
  • u010061734
  • 2014年09月15日 21:47
  • 671

冒烟测试浅谈

(一)什么时候进行冒烟测试 测试是测试人员确认软件存在bug的过程,此过程中不可避免是需要开发人员要不停的修改bug,那么常常会发现一个功能的改动,导致下一轮系统测试出现问题。即发现也许以前修改...
  • zhusongziye
  • zhusongziye
  • 2017年11月29日 21:19
  • 76

HDU 2.1.6 找新朋友

找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To...
  • hwj_wayne
  • hwj_wayne
  • 2016年03月10日 18:18
  • 521

MongoDB 设置慢查询跟踪

-- 查看跟踪级别(0为关闭,1是定义慢操作及时间,2是跟踪所有操作) db.getProfilingLevel() -- 设置慢操作级别和慢时间定义,单位毫秒(默认100ms) db.setP...
  • kk185800961
  • kk185800961
  • 2015年11月11日 14:33
  • 1960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何不让一个慢查询把服务器搞冒烟
举报原因:
原因补充:

(最多只允许输入30个字)