前言

今天测试小哥屁颠屁颠的找过来说查询会员信息这块访问速度很慢,之前没有问题,现在输入信息之后根本就没有反应.要等好好长时间才行.另外点击其他页面都是显示网络连接异常,感觉整个系统都会崩溃了。每次测试找过来都当做是对自己的一次技术提升,尤其是对和业务逻辑关联不高的问题更感兴趣,哈哈!现在把问题分析以及处理过程简单记录一下,希望对有相同线上问题的同学能提供一些解决思路.

问题分析

处理问题的第一步就是场景复现,本地打开网站看了一下确实如此.简单描述一下问题场景:这里面有一个根据会员姓名或是手机号或是卡号模糊查询会员信息的接口,选中用户简要信息之后会显示用户的详情信息,每次输入一个字符之后会调用接口进行查询,有点类似于百度中输入搜索词之后会显示相关联的搜索词.业务截图如下:

    以下截图为输入多次字符时的调用接口查询情况,由于已经对服务端存在问题做过处理,所以显示的状态都是200,修改之前都是等待状态:pending.

    分析之后主要存在两个问题:

1.接口调用过于频繁

每次输入一个字符都进行接口调用,如果手速快的话对服务器冲击得多大.看过百度或是谷歌的关联词查询,人家那么高的服务器配置都不敢输入一个字符接着去调用一次服务端,中间需要间隔一定的时间,具体的间隔调用时间可以根据数据量进行调整,以不影响用户体验为要求.这种处理方式在前端叫做节流处理,简单意思就是说在指定的时间段内不限制用户数输入的字符数,能输入几个算几个,但是限制只允许调用一次接口,接口响应之后才会发起下次请求.这样就大大减少了对服务器的冲击;

2.单个接口查询查询速度过慢

只输入一个字符之后响应时间很长,看了一下控制台的响应时间大概是15秒.猜测此处存在慢sql.

问题处理

对于问题1主要是前端访问方式的处理,问题分析中已经将处理方式做了说明,此处不再多说。主要是从服务端说一下问题2的处理过程.
    以下是此场景的数据库查询sql:

SELECT DISTINCT(staff_card.`card_no`) card_no,staff.`real_name`,staff.`mobile`,card.`card_name`,staff_card.`status`,card.id card_idFROM studioLEFT JOIN staff ON staff_studio.`login`=staff.`login`LEFT JOIN staff_card ON staff_card.`login`=staff.`login`LEFT JOIN card ON staff_card.`card_id`=card.`id`LEFT JOIN card_course ON card_course.`card_id`=staff_card.`card_id`WHERE ((staff_studio.`state`=1  AND staff_studio.`studio_id`=2 AND staff_card.`studio_id`=2) OR (card.`flag`=1 AND  card_course.`studio_id`=2 ))AND staff_card.`status` IN (1,4)AND CONCAT(staff.`mobile`,staff.`real_name`,staff_card.`card_no`)  LIKE CONCAT('%', '1','%')

数据库执行时间在11秒.
使用explain进行执行计划查询,发现type字段中有多个all,表示是全表扫描,经过多次尝试,主要做两个处理:

1.使用union all 代替or

SELECT
taff_card.`card_no`,staff.`real_name`,staff.`mobile`,card.`card_name`,staff_card.`status`,card.id card_idFROM staff_studioLEFT JOIN staff ON staff_studio.`login`=staff.`login`LEFT JOIN staff_card ON staff_card.`login`=staff.`login` AND staff_card.`studio_id`=staff_studio.`studio_id` AND staff_card.`status` IN (1,4)LEFT JOIN card ON staff_card.`card_id`=card.`id`WHERE staff_studio.`state`=1  AND staff_studio.`studio_id`=2 AND CONCAT(staff.`mobile`,staff.`real_name`,staff_card.`card_no`)  LIKE CONCAT('%', ‘1’,'%')UNION ALL SELECT
staff_card.`card_no`,staff.`real_name`,staff.`mobile`,card.`card_name`,staff_card.`status`,card.id card_idFROM staff_studioLEFT JOIN staff ON staff_studio.`login`=staff.`login`LEFT JOINstaff_card ON staff_card.`login`=staff.`login`LEFT JOIN card ON staff_card.`card_id`=card.`id`LEFT JOIN card_course ON card_course.`card_id`=staff_card.`card_id`WHERE card.`flag`=1 AND  card_course.`studio_id`=2 AND staff_card.`status` IN (1,4)AND CONCAT(staff.`mobile`,staff.`real_name`,staff_card.`card_no`)  LIKE CONCAT('%', ‘1’,'%')

2.添加索引

将explain查询中type为all的表按照查询条件或left关联字段进行添加索引,执行sql如下:

-- manage_staff_studio添加索引login
ALTER  TABLE  manage_staff_studio  ADD  INDEX  index_login (login);
-- manage_staff_card添加索引login
ALTER  TABLE  manage_staff_card  ADD  INDEX  index_login (login);
-- manage_card_course添加索引card_id
ALTER  TABLE  manage_card_course  ADD  INDEX  index_card (card_id);

添加之后测试查询速度变为0.029秒;慢sql问题处理

反思总结

由于业务设计原因,对于个别字段存在重复情况,原来使用distinct进行处理,但是使用explain查询之后发现extra中存在using temporying.查询了相关资料得知using temporying一般是进行distinct或是group by操作都会导致生成临时表,一般出现临时表是需要优化的,但是想说的是凡事没有绝对,别人说的结论自己动手要去尝试验证。只要查询速度能提升上来,出现此提示不处理也可以.后期如果需要对distinct优化等同于group by进行优化,官方文档中对此有所介绍.官方参考链接:
https://dev.mysql.com/doc/refman/8.0/en/distinct-optimization.html。
    另外说一下线上业务场景与问题定位的思路,对于服务端而言,服务端项目所部署的服务器和数据库所在服务器可能不是一个,需要分别对对应的服务器进行查看监控信息,项目中服务器都是使用的阿里云,可以通过阿里云控制台看下各项监控信息.上面的场景中存在的问题还在于发起很多个请求没有响应的情况下,打开别的页面会出现网络异常提示,对应时间节点看数据库服务器监控信息,当时CPU已经达到100%.所以其他页面不能打开也就能解释清楚了。
    如果想看详细的服务器信息可以使用atop工具进行监控,可以实时输出监控日志信息,结合服务端项目业务日志更容易进行定位问题。atop安装参考链接:
https://help.aliyun.com/document_detail/101877.html
    cpu达到100%处理方案:1.升级CPU,2.业务侧优化,主要服务器上各应用CPU占比,针对性优化.一般是对数据库或是java项目进行优化。
    以上是处理网站性能优化的记录和总结,如果看完感觉有所收获环境评论区点赞或留言!

网页性能优化实战之CPU拉满问题处理相关推荐

  1. Linux性能优化实战:CPU的上下文切换是什么意思(04)

    一.怎么查看系统上下文切换情况 通过前面学习我么你知道,过多的上下文切换,会把CPU时间消耗在寄存器.内核栈以及虚拟内存等数据的保存和回复上,缩短进程 真正运行的时间,成了系统性能大幅下降的一个元凶 ...

  2. Linux 性能优化实战(倪朋飞)---CPU 使用率

    查看 CPU 使用率 对于 CPU 使用率,top 默认 3 秒时间间隔:ps 使用的是进程的整个生命周期. top 显示系统总体的 CPU 和内存使用情况,及各个进程的资源使用情况:ps 只显示每隔 ...

  3. linux性能优化实战学习笔记-(1)CPU性能分析工具与套路

    版权归Linux性能优化实战 作者倪鹏飞,本文主要是为学习.整理相关知识点,请勿用作商用,侵删. linux性能分析工具 下图来自:Brendan D. Gregg http://www.brenda ...

  4. JavaScript系列—性能优化之《网站性能优化实战——从12.67s到1.06s的故事》

    本篇博文来源于网络 226 人赞同了该文章 原文作者:IMWeb jerryOnlyZRJ  原文链接:网站性能优化实战--从12.67s到1.06s的故事 - 腾讯Web前端 IMWeb 团队社区 ...

  5. 2 周流量激增百倍的腾讯课堂后台扩容和性能优化实战

    作者:andyawang,腾讯 CSIG 后台开发工程师 疫情期间,学校网课需求激增,腾讯课堂 2 天上线极速版,2 周内支持同时在线人数超百倍增长,对整个后台挑战非常大.整整 2 个月下来,同合作团 ...

  6. 推荐学习-Linux性能优化实战

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 推荐一个学习 ...

  7. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

  8. linux性能优化实战 倪朋飞,Linux性能优化实战:系统的swap变高(09)

    一.实验环境 1.操作系统 root@openstack:~# lsb_release -a No LSB modules are available. Distributor ID:Ubuntu D ...

  9. 网站性能优化实战(二)

    转自IMWeb社区,作者:jerryOnlyZRJ,原文链接 --从Webkit内部渲染机制出发,谈网站渲染性能优化 本文是对前文:imweb.io/topic/5b6fd- 相关知识的补充,文中的& ...

最新文章

  1. 谷歌 NAS + 目标检测:SpineNet论文详解
  2. ASP.NET MVC 5 使用autofac实现DI
  3. php怎么新建页面,whmcs创建自定义页面,创建PHP访问页面方法
  4. 音视频(H264+G711)打包AVI文件
  5. 罗美琪和春波特的故事...
  6. Qt for ios 设置程序图标(logo)和启动页(splash)
  7. JDK8新特性:函数式接口@FunctionalInterface的使用说明
  8. 跨越跨域大山,前端不得不知道的Ajax
  9. Java Base64 编码解码方案总结
  10. 前端学习(2965):路由的参数传递
  11. 文件服务器 之 VSFTPD的高手篇
  12. ECS上配置FTP Filezilla
  13. ❤️MVC三层架构及相关文档(建议收藏)❤️
  14. 从物理页面的争抢看linux内核内存管理
  15. GalGame汉化教程(一)——Ollydbg修改编码和字体
  16. java替换的程序_Java文本文件批量替换小程序的方法
  17. 关于召回率和hit rate
  18. 【量化笔记】移动均线
  19. 《追寻生命的意义》--后记
  20. Java并发指南6:Java内存模型JMM总结

热门文章

  1. 【深度学习】V-Net 3D医学图像分割 Dice loss 损失
  2. 【day 1】python编程:从入门到实践学习笔记-安装、变量和简单数据类型
  3. Web Services:自洽,编码,交换模型
  4. 范伟 赵本山 高秀敏 - 卖拐
  5. mysql 集成测试_在使用mysql的Jruby on Rails应用程序上运行Cucumber/capybara/celerity集成测试...
  6. 行车记录仪 - 国际化 - 光源频率/电源频率
  7. 2226. 每个小孩最多能分到多少糖果
  8. 南京大学计算机专业理学学士,薛健-中国科学院大学-UCAS
  9. (转载整理)三步在Ubuntu上安装微信QQ
  10. 火箭闹钟+android,火箭闹钟铃声