性能测试:数据库性能问题实战分析

news2024/11/16 21:52:06

接口压测分析
现在我们来压测一个获取用户信息接口,这个接口会涉及到数据库的数据查询。我们的项目是部署正在应用服务器上面的,因此我们需要同时监控应用服务器和数据库服务器。在这里插入图片描述
那么下面我们来看一下tomcat的这台服务器,cpu的使用率并不高,包括网络、磁盘IO等都没有什么问题。![在这里插入图片描述](https://img-blog.csdnimg.cn/694a21f136954a7fa281e2bde2cf33d9.png
下面我们在来看一下数据库的服务器,可以看到cpu已经高达100%了。存在非常明显的性能问题。那么我们可以初步分析,问题可能出现在数据库查询上面,因为我们只用了10个并发,这个并不算多。在这里插入图片描述
数据库性能分析-索引

下面我们来回看一下我们前面压测所出现的现象:
TPS很低,响应时间很长,数据库服务器cpu很高(接近100%),应用服务器负载比较低。

通常我们数据库服务器cpu很高,一般都是因为SQL执行效率低导致的。可能有三方面原因:

  • 1、数据库表中缺少必要的索引;
  • 2、索引不生效;
  • 3、SQL不够优化;

关于索引

索引是对数据库表中一列或多列的值进行排序的一种结构,存储了表中的关键字段,使用索引可快速访问数据库表中的特定信息。

那么我们初步定位是由于SQL导致的性能问题,我们是不是可以对SQL进行监控呢?

我们需要查询下mysql是否开启了慢查询

1|show variables like '%slow_query_log%

我们可以看到慢sql并没有开启
在这里插入图片描述
下面我们需要对mysql配置慢查询。具体如何配置,可以查看我的这篇博客:https://blog.csdn.net/weixin_42274846/article/details/128032102

下面我们开始对SQL进行监控,进入到mysql存放的日志路径下(之前慢查询配置中有返回具体的日志路径),因为压测前,我们并不知道里面的数据是不是我们之前压测的数据,所以我们输入 > 文件名称,如 > mysql-slow.log 来清空里面的数据,然后再进行压测。

压测过程中,我们可以看到日志中出现了大量的SQL日志,那么我们可以确定再压测的过程中,这些SQL的响应时间已经超过了我们原先配置的预期值了。在这里插入图片描述
那么我们已经知道有哪些慢SQL了,接下来应该如何对这些SQL进行分析呢?

在/usr/bin目录下,使用mysql自带命令 mysqldumpslow 。这个工具下面提供了一些参数,关于参数的介绍,可以再我之前的慢sql配置的博客中,有介绍。

那么我们下面用如下命令进行分析:

1|mysqldumpslow –s at -t 5 mysql-slow.log
// 显示出耗时最长的5个

在这里插入图片描述
上面我们可以看到返回了一条SQL。我们来具体看看这些返回的数据到底是什么含义:

  1. Count:顾名思义,就是这条SQL执行的次数
  2. Time:SQL执行的时间,这里我配置的慢SQL时间是(0.05s),这里0.07s相当于是70ms,可能很多人会觉得70ms算短的,时间确实很短,但是对于一个接口而言,数据库就用到了70ms,那么整个http请求,包含业务逻辑、网络因素、以及前端渲染等时长,最终用户所得到的响应是非常长的。
  3. 下面显示了超时的SQL

我们可以看到这是一条非常基础的查询SQL,那么我们已经知道SQL非常慢了,具体我们应该怎么去做分析呢?我们mysql提供了explain方法。

explain的简介
mysql中可以使用explain这个关键字来获取(查询)sql语句的查询执行计划的。使用explain关键字,可以模拟mysql优化器执行的sql语句,从而知道mysql是如何处理sql语句的。通过explain可以分析查询语句或表结构的性能瓶颈。

explain的作用
①、查看表的读取顺序

②、数据读取操作的操作类型

③、查看哪些索引可以使用

④、查看哪些索引被实际使用

⑤、查看表之间的引用

⑥、查看每张表有多少行被优化器执行

打开navicat数据库连接工具,做过测试的朋友,几乎每个人电脑都会安装这个工具。下面我们输入这条SQL语句,再SQL前,加上 EXPLAIN, EXPLAIN指的是执行计划。
在这里插入图片描述
我们的SQL为什么执行的慢的,主要查看的就是结果的type。Type指的是我们对索引的使用情况。下面是关于MYSQL执行计划 TYPE值的关系:在这里插入图片描述
性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const 性能在 range 之下基本都可以进行调优

那我们可以看到上面的SQL查询,他返回的type值为all,这个性能是非常差的。通常出现all的情况下,主要是因为该表没有建索引导致的。下面我们打开该表的表设计可以看到果然表中没有建索引。
在这里插入图片描述
给他加索引,通常索引是加sql where后面的条件。(通常发现是索引问题,可以让开发通知DB去加就行。)在这里插入图片描述
下面我们把这个索引值给加上。上方我们可以看到有个索引类型,通常工作中常用的类型有NORMALUNIQUE。选择类型需要根据业务类型也决定,UNIQUE 是唯一值,如果说我们选择了UNIQUE,那么之后user_name就是唯一的,之后插入相同的user_name,数据库就会报错。

这里我们公司的业务是user_name是唯一的。所以选择 UNIQUE 。后方的索引方式,默认都是选择BTREE

保存之后,我们再来看一下sql的执行计划。我们可以看到直接变成const了。从最差变成了最好。在这里插入图片描述
现在我们加了索引,再重新做一下压测。我们来看一下压测的数据。性能明显提升上去了,由原先的40个tps到了400多,响应时间也从原来的200ms变成了20ms左右。
在这里插入图片描述
下面我们再来看一下数据库服务器,cpu的空闲率现在也变成了70%左右了。在这里插入图片描述
我们再来看一下应用服务器,但是现在压力到了应用服务器上面。通常情况下应用服务器如果性能不好我们可以进行扩容,但是如果是数据库服务器性能问题,会比较麻烦,这个涉及到了架构问题。在这里插入图片描述
结果总结
如果我们的SQL是全表扫描会非常影响服务器的性能,直接导致数据库服务器的cpu飙升。因此可以得出索引的设置,直接影响到了我们的性能,索引的选择相差也是非常大的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux系统怎么安装宝塔面板

linux系统怎么安装宝塔面板 怎么安装宝塔面板&#xff1f;这个其实很简单接下来跟着我操作&#xff1a;以linux centos7.6 举例 Centos安装脚本&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh i…

JavaScript -- 10. 一文了解DOM对象及常用方法

文章目录1. DOM介绍1.1 什么是DOM1.2 概念1.3 关系1.4 HelloWorld1.5 document对象2. DOM节点2.1 元素节点2.1.1 获取已有的元素节点2.1.1 document.getElementById()2.1.2 document.getElementsByClassName()2.1.3 document.getElementsByTagName()2.1.4 document.getElements…

设计模式之简单工厂模式

simple factory design pattern 简单工厂模式的概念、简单工厂模式的结构、简单工厂模式优缺点、简单工厂模式的使用场景、简单工厂模式的实现示例 注&#xff1a;简单工厂模式没有被收录在 GoF 的二十三种设计模式中。 1、简单工厂的概念 简单工厂模式&#xff0c;与其说是设…

32位PCI转CPCI转接板

功能型号 32位PCI转CPCI转接板&#xff0c;调试卡 支持PICMG 2.0 D3.0规范&#xff1b; 支持33MHz速率&#xff1b; 支持32bit总线&#xff1b; 功能描述 1、沉金工艺&#xff0c;接触更好&#xff1b; 2、四层板设计&#xff0c;抗干扰更好&#xff1b; 3、信号线等长处理&…

【论文精读9】MVSNet系列论文详解-AA-RMVSNet

AA-RMVSNet&#xff0c;论文名为&#xff1a;AA-RMVSNet: Adaptive Aggregation Recurrent Multi-view Stereo Network&#xff0c;CVPR2021&#xff08;CCF A&#xff09; 本文是MVSNet系列的第9篇&#xff0c;建议看过【论文精读1】MVSNet系列论文详解-MVSNet之后再看便于理解…

【Java 快速复习】 Java 内存模型 并发问题本质

【Java 快速复习】 Java 内存模型 & 并发问题本质 在 Java 领域&#xff0c;我们经常会说两个名词大家要有所区分&#xff1a; JVM 内存模型&#xff1a;这个所说的是 JVM 内存的划分规则&#xff0c;如 堆、栈、元空间等Java 内存模型&#xff1a;这个所说的是线程和主内…

【计算机网络】应用层

应用层的许多协议都是基于客户服务器方式。 客户和服务器指通信中所涉及的两个应用进程。客户服务器方式描述的是进程之间服务和被服务的关系。客户是服务请求方&#xff0c;服务器是服务提供方。 P2P模式&#xff1a;整个网络中的传输内容不再被保存在中心服务器中&#xff…

怎么裁剪视频?手把手教你裁剪

这两年&#xff0c;随着网课的不断发展&#xff0c;我们可以很轻松的就在网上找到各种课程视频。可是有时候&#xff0c;一些视频里面的重点内容往往只有那几分钟&#xff0c;当我们回顾的时候&#xff0c;需要不断跳转&#xff0c;这就显得有些麻烦。其实我们可以将重点内容裁…

【代码随想录】二刷-回溯算法

回溯算法 《代码随想录》 什么是回溯算法&#xff1f; 回溯算法也可以叫做回溯搜索法&#xff0c;它是一种搜索方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯法的效率: 回溯法的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案。(n…

如何使用virtualenv实现python环境的隔离?

有关更多的Python 开发内容,可访问:《 Python Flask开发指南》​​​​​​​ virtualenv可以帮助我们来创建一个Python的虚拟环境,虚拟环境可以独立并隔离外部的python环境,方便我们对于不同项目使用不同的python依赖,已经依赖版本的不同而导致的错误。本篇文章主要来了解…

2022全年度冰箱十大热门品牌销量榜单

自2022年年初以来&#xff0c;各地纷纷部署支持包括冰箱在内的家电大宗消费政策措施&#xff0c;其中家电补贴政策是刺激家电消费的主旋律。宏观经济政策环境改善&#xff0c;利好冰箱行业的长期发展。 根据鲸参谋数据统计&#xff0c;今年京东平台冰箱的年度累计销量达到1400多…

论文阅读笔记《Learning Combinatorial Solver for Graph Matching》

核心思想 本文提出一种基于学习的组合求解器来实现图匹配。之前基于学习的图匹配方法都是利用神经网络提取特征构建关联矩阵&#xff0c;然后再利用可微分的Sinkhorn算法求解匹配矩阵。但本文提出的方法没有显式的构建关联矩阵和求解匹配矩阵的过程&#xff0c;而是将其转化成关…

SpringBoot:核心模块盘点

spring-boot-project 是 spring-boot 核心技术包&#xff0c;其中包含了 spring-boot 所有基础源码&#xff0c;其中很多模块都是我们了解 spring-boot 的重点。 &#xff5e; 本篇内容包括&#xff1a;spring-boot-project 包介绍、Spring Boot 核心模块 文章目录一、spring-b…

SpringCloud-Geteway之限流,熔断(超详细篇)

目录 一&#xff0c;Sentinel--服务容错 1.1 高并发带来的问题 1. 使用压测工具,对请求进行压力测试 2.修改配置文件中tomcat的并发数 1.2 服务雪崩效应 1.3 常见容错方案 1.4 Sentinel入门 什么是Sentinel 微服务集成Sentinel 安装Sentinel控制台 实现一个接口的限…

QTextLine、QGlyphRun、QTextLayout

QGlyphRun 一、描述 此类提供对字体中内部字形的直接访问。在某些情况下&#xff0c;开发人员可以对特定字体中的字形绘制到屏幕上进行更低级的控制。 当Qt显示以Unicode编码的文本字符串时&#xff0c;它会将Unicode点转换为基于字体的字形索引列表和位置列表。QGlyphRun 提…

企业对于源代码加密需求分析

需求 随着企业信息化发展的日益增长&#xff0c;软件行业厂商之间的竞争也愈加白热化&#xff0c;加上国内对知识产权的不够重视、山寨模仿产品的横行。保护源代码、保证企业的核心竞争力&#xff0c;成为众多软件研发企业的第一要务。那么企业应该如何保证源代码的安全呢&…

[附源码]计算机毕业设计常见Web漏洞对应PC应用系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

HTTP缓存机制(Cache-Control)

文章目录HTTP缓存机制HTTP缓存机制 HTTP 协议通常应用于分布式信息系统&#xff0c;所谓分布式信息系统&#xff0c;是指以计算机网络为基础&#xff0c;将系统的数据与功能分别布置在不同的地方&#xff0c;然后再通过网络将数据与功能连接的信息系统。由于系统需要处理大量的…

世界杯期间我使用Python生成二维码“为中国队辟谣”

二维码介绍 二维码本质上&#xff0c;就是一段字符串&#xff0c;我们可以把任意字符串&#xff0c;制作成一个二维码图片。在生活中&#xff0c;使用二维码更多的是一个URL&#xff08;网址&#xff09;。 引入 qrcode库 qrocde库网址&#xff1a;qrcode PyPI 进入网址之后…

[附源码]计算机毕业设计贷款申请审核管理系统论文Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…