发现性能问题

上一次导入数据后,发现系统十分的卡顿,但是才仅仅1000多条数据而已,怎么会让系统变得如何的卡顿呢?于是我开始走在排查系统卡顿的原因的道路上。

首先,先定位问题是出现在前端上还是后端上。打开浏览器,输入localhost:7000, 然后F12打开netword。启动后端项目,查看log。切换回浏览器,右键刷新。结果发现好多些问题:

  1. 请求发送的个数比较多。
  2. 后端每个接口的响应时间都比较长,都超过了1s,这明显有问题。
  3. 前端很多请求从: 发送请求到页面渲染成功所需要的时间大于了10S(发送请求时间+后端接口响应时间+下载资源时间,即回传数据时间+页面渲染时间)。

从上面这几个现象可以看出:

  1. 后端有明显的问题。
  2. 前端暂时没有什么问题。

好好分析一下,为什么后端每个接口的响应时间都会超过1s,mongodb是出了名的速度快,一般查询数据就几十ms,普通查询也不会超过300ms。但是看到的接口响应时间却是超过了1s,有的还是明显3,4s。

苦苦冥想,细细推测,思来想去,都不知道是怎么回事,最后只有采用删代码的方式来定位问题了。

当删除类似于下面的代码的时候

Schema.virtual('affixes', {
ref: 'Affix',
localField: '_id',
foreignField: 'businessId',
});

这个时候,发现后端接口的响应时间正常了,可以判断,这段代码起到了一定的作用,但是这只是简单的连表查询而已。为什么就导致接口响应时间多那么多呢?

我继续分析,进入到controller.js里面,将与表关联查询的代码找出来,终于,我快要发现元凶了,删除这几行代码,ok,同样,响应时间正常了。

仔细分析这几行代码,发现了一个很重要的事情: 居然是全表查询!!而且是3张表关联的全表查询!!所以...查询的数据差不多就是这个量: 2000 * 2000 * 2000, 也怪不得为什么响应时间会超出1s了。

第一个元凶已经被抓住了。但是我还并不知道为什么前端从请求到渲染成功的时间怎么会超过10s,这简直不能忍。

清空network,然后刷新,重新发送请求,可以看见发送了5个左右的请求,而查看后端的log发现其中3个请求都是在做表关联的全表查询,并且reply的时候还是将所有的数据都返回到前端里去了。

ok,现在我大概已经知道为什么会有超过10s的响应时间了,下载的数据量也比较大,所以响应时间 = 发送请求时间 + 后端处理时间 + 下载资源时间 + 渲染时间, 由于数据量比较大,所以导致最后的两个时间也不小。

现在大概已经都找出了为什么页面会卡顿并且迟缓。原因就是没有做后端分页,系统里用的是前端分页。

性能优化总结

  1. 查询数据避免多张表关联全表查询。
  2. 先过滤再关联查询,而不是先查询再关联表。
  3. react里多个列表,一定要设置key。
  4. 分页一定不要前端做,因为数据量大了肯定要崩掉的。

一次关于mongodb性能踩坑的总结的更多相关文章

  1. 微信小程序性能测试之jmeter踩坑秘籍(前言)

    最近要做个微信小程序的性能压测,虽然之前只做过web端的,但想一想都是压后端的接口,所以果断答应了下来,之前对jmeter都是小打小闹,所以趁着这次机会好好摆弄摆弄. ---------------- ...

  2. Win10 安装配置 MongoDB 4.0 踩坑记

    redis 官方没有 Windows 版的,微软维护的已经好久没更新了,所以就在想着换成 MongoDB. 于是一趟被我复杂化的踩坑之旅就开始了,同时也记录一下,避免有人遇见跟我一样的问题. 首先在  ...

  3. 【Unity游戏开发】性能优化之在真机上开启DeepProfile与踩坑

    一.引子 最近马三入职了新公司,平时除了负责编辑器开发之外还要做一些游戏性能优化方面的工作.在这里首先给大家安利一下Unity官方的性能测试分析工具URP ,这个工具目前是免费,测试的过程中也不需要接 ...

  4. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

  5. 一次shardingjdbc踩坑引起的胡思乱想

    项目里面的一个分表用到了sharding-jdbc 当时纠结过是用mycat还是用sharding-jdbc的, 但是最终还是用了sharding-jdbc, 原因如下: 1. mycat比较重, 相 ...

  6. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  7. 记jQuery.fn.show的一次踩坑和问题排查

    最近很少已经很少用jQuery,因为主攻移动端,常用Zepto,其实很多细节和jQuery并不一样.最近又无意中接触到了PC的需求和IE6, 使用了jQuery,刚好踩坑了,特意记录一下. 本文内容如 ...

  8. JavaScript 踩坑心得— 为了高速(下)

    一.前言 本文的上一篇 JavaScript 踩坑心得- 为了高速(上) 主要和大家分享的是 JavaScript 使用过程中的基本原则以及编写过程中的心得分享,本文主要和大家聊聊在各个使用场景下的 ...

  9. JavaScript 踩坑心得— 为了高速(上)

    一.前言 很多情况下,产品的设计与开发人员一直想打造一套高品质的解决方案,从而快速.平稳地适应产品迭代.速度是衡量产品适应性的真正且唯一的标准,而且,这并不是笔者的一家之言. 「速度是衡量适应能力的真 ...

随机推荐

  1. 6.如何使用jedis的线程池

    Basic usage example using Jedis in a multithreaded environment You shouldn't use the same instance f ...

  2. Tagged Pointer

    前言 在2013年9月,苹果推出了iPhone5s,与此同时,iPhone5s配备了首个采用64位架构的A7双核处理器,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念.对于6 ...

  3. 浙江省新高中信息技术教材,将围绕Python进行并增加编程相关知识点

    2017年初消息: 浙江省信息技术新教材,即将在2017级(2017年9月入学)高中新生中开始使用. 据了解,与目前的选考(可以理解为高考科目)要求的信息技术教材由3本<信息技术基础>.& ...

  4. Jmeter之分布式测试

    1)Jmeter 是纯java 应用,对于CPU和内存的消耗比较大,并且受到JVM的一些限制: 一般情况下,依据机器配置,单机的发压量为300-600,因此,当需要模拟数以千计的并发用户时,使用单台机 ...

  5. Postmessage运用-往飞信添加信息

    1.定位窗口 fHwnd:=FindWindow(nil,'短信中心'); then begin showmessage('请先登录飞信2013短信中心'); exit; end; { applica ...

  6. IScroll那些事——内容不足时下拉刷新

    之前项目中的列表是采用的IScroll,但是在使用IScroll有一个问题就是:当内容不足全屏的时候,是木有办法往下拉的,这样就达不到刷新的目的了.[这是本人工作中遇到的,具体例子具体分析,这里只作一 ...

  7. ps_cc切片

    web前端开发的工作流程的第一步就是根据ui给的psd来还原设计图样貌. 可是一打开满屏的参考线.这时我们可以alt+v+d清空参考线 这时可以按alt+鼠标拖放图片.同时也可以按F进入半屏和匀速连按 ...

  8. ActiveMQ结合WebScoket应用例子以及介绍

    一.ActiveMQ的介绍? 1.JMS基础概念 JMS(java Message Service) 即使java消息服务,它提供标准的产生.发送.接收的接口简化企业应用开发,它支持两种消息通信模型: ...

  9. Android项目导入工程Module

    在Android开发过程中,我们经常引用一些模块,或者自己封装好的Project.在Android Studio某个项目是可以引入多个Module的.这样导入Module的好处方便对源码修改以适合自己 ...

  10. docker~使用阿里加速器安centos

    回到目录 上一篇说了hub.docker.com里拉个镜像太,而阿里云为我们做了不少本国镜像,这样下载的速度就很惊人了,下面看一下在centos7下配置阿里云加速器的方法 打开服务配置文件 vi /e ...