后台用了一年多,现在查询报表变得很卡,大概要15~180秒,运营经常反映报表加载不出来,我去服务器一看日志,原来查询花了200多秒,nginx直接超时了……

先优化一下 SQL

我的想法是优化报表的 SQL 语句,因为我发现查个 sql 居然加起来要 10几秒。

我们的 sql 分为2条,一条是先查总数,这是为了下一步分页用。另一条是查详情。

查总数的 sql 我看了下,index 都有用到,但是在 explain 中多出了 using temporary; using file sort; 这2项。于是我把 group by date 去掉,这2项就没了。

于是吭哧吭哧地把数据都加载出来,然后在代码里 group by,虽然比较费内存和 CPU,但总比让数据库做好啊对不对?

后来想着对第二条也这样优化,但是发现不行,因为第二条有个分页,不 group by 的话,就没法分页了……这个暂时没想到替代方法。可怜代码已经写了2小时了,只好先不用了。

代码写完了,本地测试一下,发现查询速度从 9s 降到 1s,果然有效! 于是赶紧弄上服务器,然后一试,变成 32s 了!而且 cpu 、内存狂涨! 无语了,赶紧回滚了。

事后分析,大概是因为数据量太大,服务器也处理不过来了……

试试缓存?

这事只好作罢,心里想,慢点就慢点吧,反正也是自己人用。 但是渠道那边又来找了,说是我们的 api 拉取超时了。这下就比较难办了,渠道那边超时,可能会影响我们正常的业务。况且这种现象如果听之任之,最终可能引发雪崩效应,到时就麻烦了。

但是现在数据库优化很蛋疼,怎么办呢?这时还是应该从业务角度考虑,渠道要的数据并不是实时数据,所以完全可以用缓存顶一下嘛。

django 的话,直接用 django-cacheops 就行了,挺好用的,直接在 queryset 后面加个 .cache() 就可以启用缓存了,当然配置里面要设置一下,不然它默认对所有查询都缓存就不好了,毕竟运营要看到的是实时数据。

代码改好了,部署上去,加载时间立即缩短了10倍!而且不是光 api 接口,连报表的查询也大大缩短了!真是意外的惊喜啊。

所以从这件事可以总结出2个道理: 1. sql 查询变慢了,不一定是这条 sql 本身,可能是慢查询太多,导致它被拖累了 2. 缓存一定要用上,减少数据库的压力是非常有必要的。

redis 的问题

不过,刚高兴没多久呢,也就1、2分钟吧,接口就报 500 错误了,异常信息提示 Connection closed by server ,郁闷,赶紧回滚。然后就在本地测,结果一点问题没有。我猜可能是配置不一样,但具体是哪个参数我也不知道了。

然后就是上网查资料,发现一个参数 timeout 貌似有用。分别在本地和服务器端看了下,原来本地 timeout = 0,服务器是 timeout = 60 。把它改过来之后,终于正常了。

不过呢,最近遇到的 redis 的问题挺多的,比如服务器上经常遇到 use of closed network connection ,这个就挺郁闷的,完全不知道怎么下手。

现在疏理一下,timeout 是 redis 用来控制客户端连接的。如果 timeout > 0 的话,如果客户端持续 timeout 秒没有活动,redis 就会关闭这个连接。

如果设置成 timeout = 0,就表示永远不关闭。

问题在于,admin 服务器请求量小,确实可能 60s 里没有活动,redis 可以关闭它,但是广告服务器请求量很大,为什么还是会关闭呢?

批量查询preparedstatement只需要最后关闭还是每次都关闭_该用缓存还是得用缓存...相关推荐

  1. 使用通用mapper实现条件查询_【微服务】152:Stream流和通用mapper批量查询的使用...

    今天是刘小爱自学Java的第152天. 感谢你的观看,谢谢你. 学习计划安排如下: 补充完昨天商品查询中关于分类和品牌的部分,其中牵扯到了两个非常重要的知识点: Stream流的使用,这个学过后基本就 ...

  2. 百度指数-批量查询器。收费!!!?还是自己来吧。

    园子里的高手们,在园里潜水2年多了,今天出来透透气.这也是第二篇往首页推的东西,发个自制小工具帖,高手们就见笑了~~ 昨天,老大让我采集一些数据.然后,在那些数据里面找出百度指数比较高的,做专题.40 ...

  3. php设计分布图,MySQL分表实现上百万上千万记录分布存储的批量查询设计模式[图]_MySQL...

    我们知道可以将一个海量记录的 MySQL 大表根据主键.时间字段,条件字段等分成若干个表甚至保存在若干服务器中. 唯一的问题就是跨服务器批量查询麻烦,只能通过应用程序来解决.谈谈在Java中的解决思路 ...

  4. hibernate批量查询_使用Hibernate批量获取

    hibernate批量查询 如果需要从Java处理大型数据库结果集,则可以选择JDBC,以提供所需的低级控制. 另一方面,如果您已在应用程序中使用ORM,则回退到JDBC可能会带来一些额外的麻烦. 在 ...

  5. Django 基础(12)-Django drf 分页查询(批量查询)、自定义分页器

    文章目录 Django drf 分页查询(批量查询) PageNumberPagination:普通分页 Django 自定义分页器 自定义批量查询的返回结构 LimitOffsetPaginatio ...

  6. mongo go 查询指定字段_Go语言 操作MongoDB数据库批量查询

    数据操作是编程中避免不了的操作,这也就牵扯到了数据库的增删改查,而实际工作中我们最常用到的是增改查.今天要介绍的是Go 语言查询MongoDB数据库. 操作mongodb使用的包是"http ...

  7. elasticsearch索引的初始化操作以及marvel操作(增删改查),批量查询_mget,批量操作_bulk

    文中的简洁版都是使用marvel操作的 安装marvel插件的教程 https://blog.csdn.net/u013294097/article/details/100144725 1.创建索引之 ...

  8. 备库批量查询失败的原因分析

    目前线上有一套环境是10gR2的,采用了一主两备的架构.在其中一个备库上每天凌晨会开放一个窗口运行一些批量的查询,目前使用dg broker会在指定的时间把备库置为read-only,查询完毕之后修改 ...

  9. 网站域名过户查询_聚查教你怎么用域名批量查询工具查询网站历史和域名权重...

    购买老域名之前,要先查网站历史和域名权重,但是很多小编都找不到合适的域名批量查询工具,那么,聚查教你怎么用域名批量查询工具查询网站历史和域名权重. 一:域名批量查询工具查询网站历史和域名权重查询入口 ...

  10. 快递单号如何批量查询呢

    我们都知道,做电商或物流行业的朋友,为了可以及时掌握大批量集中发出的快递信息的物流状态,都需要对快递单号进行查询,传统的一个个查询快递的方法早已落伍,为了提高效率,我们可以利用一些辅助工具来批量查询快 ...

最新文章

  1. [Js/Jquery]jquery插件开发
  2. sqlserver中计算某个特殊字符在字符串中出现的位置
  3. Python 之Re模块(正则表达式)
  4. 为何高并发系统中都要使用消息队列
  5. Undo TableSpace ①.管理方法
  6. 凤凰涅槃:从 iBatis 到 MyBatis
  7. ubuntu16安装最新protocbuf 和 protoc-gen-go
  8. 攻防比赛_2020年度泉州市大学生网络安全攻防比赛在黎明职业大学圆满落幕
  9. 关于Promise详解
  10. 三十岁学python_我30岁了,转行学编程可以吗? 排除法告诉你答案
  11. SpringBoot 2.0 系列003 -- 自定义Parent
  12. python cnn模型_CNN系列模型发展简述(附github代码——已全部跑通)
  13. 117. php empty()函数坑
  14. NetCore Vue前端实现导出功能及解决导出excel表格无法打开的问题
  15. 骁龙855+4800万像素+五大配件,魅族16s开售
  16. 【python】HTTP压力测试过程中遇到的问题与解决方案
  17. node.js 从入门到?
  18. linux上下左右为ABCD
  19. CSMA/CD最大/最小帧长 争用期
  20. 一文带你吃透计算机网络(下)

热门文章

  1. 生成对抗网络系列—ACL-GAN
  2. 浅谈混合精度训练imagenet
  3. 介绍一篇路端传感器的cooperative perception(3D目标检测)论文
  4. java 执行 jar 包中的 main 方法
  5. LDD3 第15章 内存映射和DMA
  6. 使用JDK开发WebServrice案例
  7. 3 Git服务器搭建
  8. Silverlight Xap和Html Asp.net参数传递
  9. 超像素 Superpixel
  10. 【Matlab学习笔记】【函数学习】max()和max(max())的区别