性能测试-数据库

一、数据库事务机制

ACID描述

1、原子性Atomicity:事务通常由多个语句组成。原子性保证将每个事务视为一个“单元”,该事务要么完全成功,要么完全失败

2、一致性Consistency:“一致”是指数据库中的数据是正确的,不存在矛盾。事务的一致性是指事务执行前后,数据都是正确的,不存在矛盾。如果执行后数据是矛盾的,事务就会回滚到执行前的状态(执行前是一致的)

3、隔离性Isolation:通常数据库会有多个事务同时执行,隔离可确保事务的并发执行不会相互干扰。

4、持久性Durability:持久性保证一旦事务被提交,即使在系统故障(例如,停电或崩溃)的情况下,事务也将保持提交状态

一致性详解:数据库事务一致性的理解_事务的一致性-CSDN博客

二、数据库锁机制

锁机制保证了数据库事务的ACID特性

表锁

行锁

查看锁情况:mysql8查看锁信息_Mysql_脚本之家

1、性能测试,涉及更新数据库的接口,比如修改用户头像,可能会因为锁,导致接口慢

2、性能测试,某个接口,比如注册,如果需要操作三个表,但是批量执行后,三个表更新的数据条数不一致,说明事务控制出了问题。——所以性能测试后要验证数据库中数据的一致性

三、数据库调优思路汇总

1、数据库出现瓶颈的现象:

1.1、资源使用率过高

CPU、网络资源、硬盘资源、内存

1.2、有慢查询日志

超过慢查询阈值long_query_time的增删改查语句

查询是否开启慢查询

show variables like '%slow_query_log%';

开启慢查询

set global slow_query_log='ON';

修改慢查询阈值(查过这个值的查询、更新会被记录到满查询log中)

set global long_query_time=1;

满查询日志

slow_query_log_file

注意:命令行可以,navicat会报错误

mysql> show variables like '%slow_query_log%';
+---------------------+-----------------------------------------+
| Variable_name       | Value                                   |
+---------------------+-----------------------------------------+
| slow_query_log      | OFF                                     |
| slow_query_log_file | /var/lib/mysql/VM-100-3-centos-slow.log |
+---------------------+-----------------------------------------+
2 rows in set (0.00 sec)
mysql> set global slow_query_log='ON';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%slow_query_log%';
+---------------------+-----------------------------------------+
| Variable_name       | Value                                   |
+---------------------+-----------------------------------------+
| slow_query_log      | ON                                      |
| slow_query_log_file | /var/lib/mysql/VM-100-3-centos-slow.log |
+---------------------+-----------------------------------------+
2 rows in set (0.00 sec)
mysql> set global long_query_time=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%long_query_time%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

2、调优——连接池

连接池过多——数据库压力大,处理变慢——资源使用率高——降低连接池数量

连接池过少——应用等待连接池释放消耗时间,导致程序响应慢——资源使用率低——增加连接池数量

3、调优——内存大小

内存大小变量:innodb_buffer_pool_size

可以修改该变量,调整大小,数据库一般独立部署运行,服务器的内存80%给到数据库

mysql> show variables like '%innodb_buffer_pool_size%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

mysql> 

4、调优——SQL

4.1 查询调优
(1)尽量用到索引

未用到索引的情况
- 对应筛选条件 没建立索引,那就不会用到索引
-【数据量比较小】创建了索引不一定会用到索引,数据库本身有优化机制


如何查看表创建的索引show index from 表;

如何检测SQL语言用到索引
查看执行计划:EXPLAIN  sql 语句
执行计划内容:

主要看Type字段,从上往下 --- 逐步变慢


 索引最好的状态就是以下三种
1)consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据

2)ref 指的是使用普通的索引(normal index)

3)range 对索引进行范围检索

下面三种都比较慢type=index,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range 还低,与全表扫描是小巫见大巫

(2)尽量避免查询不需要的数据查询需要的信息

避免:select *
实际业务场景,可能只需要记录的 部分字段
原因:查询不需要的数据 -- 占内存、网络带宽最终 影响 响应时间、吞吐量


(3)避免大量的表关联 join

一条SQL查询 涉及的表越多, SQL越慢
 阿里巴巴 内部: 禁止出现 3张表以上的关联查询


(4)搜索场景严禁左模糊或者全模糊

like 模糊查询可能导致索引失效

右模糊走索引,左模糊、全模糊不走索引
 
右模糊 'aa%'

全模糊:'%aa%'

左模糊: '%aa'


(5)功能设计: 不论表大小,都要加上分页的参数

防止 后续数据库表数据增加,而产生性能问题
性能测试-- 针对未来的某个场景模拟 未来表数据增加之后,系统是否能够支撑

4.2 更新调优

非必要,不要主动锁数据
    数据库 提供SQL语句,主动 锁表/锁记录
    如果因为数据被锁,而导致 请求变慢 【监控 数据库 锁等待信息】
及时关闭事务
    事务 会导致 数据库 锁表/锁数据 情况
    操作完数据库之后,没有及时 关闭事务,可能导致其他操作数据的变慢
大量更新可以用批处理
    业务场景
        数据导入功能
        数据批量删除/修改
    1. 数据库 -- 批量执行多条SQL语句
    2. 插入 -- values sql

5、调优——表结构

设计表的时候。就要考虑索引
    数据量非常大的时候,创建索引是很慢的
    创建索引也可能导致数据库变卡


表结构可以适当的做一些冗余
字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:

      1)不是频繁修改的字段。

      2)不是 varchar 超长字段,更不能是 text 字段。正例:商品类目名称使用频率高,字段长度短,名称基本一成不变,可在相关联的表中冗余存储类目名称,避免关联查询

缺点: 字段修改的时候会涉及多个表很麻烦,而且占用更多空间 这就是性能优化的取舍

触发器、主外键,高并发下避免使用
触发器:当我们执行数据操作的时候, 触发数据库里面设定好的 存储过程的时候/用户自定义功能的执行
主外键:当进行数据变更的时候, 数据库会去额外进行主外键检测
主外键的目的:是为了确保数据的正确性 ,例如:员工表里面的 部门ID字段,和 部门表的ID字段 一一对应,数据的正确 应该交给 应用程序去维护(业务逻辑),而不是交给数据库,因为数据库的性能不高,删除部门之前,程序先查询部门下是否有员工。尽量少让数据库干活


表字段类型尽量和使用时需要的类型相匹配,避免无谓的类型转换

6、调优——集群架构

单台数据库服务器,在面临海量的数据,海量的请求情况下, 肯定是有上限
集群架构
    用多台服务器
    部署多个数据库服务
    从开发调用的角度,依然是像一台服务器去使用‘
 

数据库服务器
     分库分表:每个数据库服务器上,有一张结构一样的表:
 

shardingsphere(数据库中间件)

官网:https://shardingsphere.apache.org/index_zh.html

虚拟数据库:本质上是数据库代理,需要依赖java环境
server.yaml:配置 虚拟数据库 用户名 和密码
config-sharding.yaml:真实操作的数据库信息、操作的规则
start.bat:启动,默认端口 3307
使用时,连接数据库代理,而不是 真实的数据库
注意事项: 这个软件也是需要单独部署,这个服务器也需要监控起来这个服务器的配置也需要比较高,所有的sql 都需要经过 
它不做数据真实存储,只是 做SQL的分发,和 结果的合并

分库分表
    一个表拆分为多个表,甚至放在不同的服务器
读写分离
    一个数据库 主服务器 负责 写入数据
    读取数据的所有sql请求,由其他从服务器进行处理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之单链表及其实现!

目录 ​编辑 1. 顺序表的问题及思考 2.链表的概念结构和分类 2.1 概念及结构 2.2 分类 3. 单链表的实现 3.1 新节点的创建 3.2 打印单链表 3.3 头插 3.4 头删 3.5 尾插 3.6 尾删 3.7 查找元素X 3.8 在pos位置修改 3.9 在任意位置之前插入 3.10 在任意位置删除…

深入解析CAS的原理机制

一、基本概述 1.1 引入背景 例:i。假设由线程A和B需要对i进行加1的操作。线程A和线程B会分别从主内存中读取i值到自己的工作内存中。原本相加之后的值为3,但线程A和线程B分别加1后将值刷新到主内存,发现主内存的值为2,出现错误。…

学c还行,学Python很累,还有其他语言适合我吗?

学c还行,学Python很累,还有其他语言适合我吗? 在开始前我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪资涨到18k的, 我师父给了一些 电气工程师学习方法和资料&a…

新建项目module,但想归到一个目录下面

1. 想建几个module, 例如 component-base-service,component-config-service, 但是module多了会在CloudAction下面显示很多目录, 所以想把它们归到components模块下面去, 类似于下图的效果 2. 创建过程 右击CloudAction 新建 module -> 选maven类型 输入components, 建成后删…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二:Fast R-CNN图文详解

RCNN算法详解:【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列一:R-CNN图文详解 学习视频:Faster RCNN理论合集 Fast RCNN 概念辨析 1. RoI 在Fast R-CNN中,RoI(Region of Interest,感兴…

Spring多线程事务处理

一、背景 本文主要介绍了spring多线程事务的解决方案,心急的小伙伴可以跳过上面的理论介绍分析部分直接看最终解决方案。 在我们日常的业务活动中,经常会出现大规模的修改插入操作,比如在3.0的活动赛事创建,涉及到十几张表的插入…

使用DateUtil工具类偏移日期

使用DateUtil工具类偏移日期 一、依赖二、源码三、示例代码 一、依赖 <!--工具依赖--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>二、源码 …

Python常用图片数据方法

文章目录 1. 常用图片数据类型2. 图片的显示2.1 plt.imshow()2.2 使用 turtle 来绘制图片 3.图片ndarray数据的常用切片操作使用 cv2 来读取图片打印数据R G B 通道的获取BGR 转成 RGBcv2 不支持中文路径的解决方法 4 PIL.Image 转成 QImage 或 QPixmap 1. 常用图片数据类型 使…

Android基础开发-通讯录的添加和查询

案例&#xff1a;往手机通讯录添加信息&#xff0c;输入姓名和手机号。 保存的手机的表&#xff1a;一共有两个&#xff0c;一个是主表&#xff0c;提供一个联系人id&#xff0c;另外是辅表&#xff0c;提供id对应的手机号和姓名。 普通操作&#xff1a;一个表一个表的添加 …

【黑马程序员】python函数

文章目录 函数什么是函数为什么学习函数函数定义函数的传入参数函数的返回值返回值基础None返回值 函数说明文档函数的嵌套调用定义代码示例 全局变量和局部变量全局变量global变量局部变量 函数综合案例 函数 什么是函数 组织好的&#xff0c;可重复使用的、用来实现特定功能…

【每日八股】Java基础经典面试题2

前言&#xff1a;哈喽大家好&#xff0c;我是黑洞晓威&#xff0c;25届毕业生&#xff0c;正在为即将到来的秋招做准备。本篇将记录学习过程中经常出现的知识点以及自己学习薄弱的地方进行总结&#x1f970;。 本篇文章记录的Java基础面试题&#xff0c;适合在学Java基础的小白…

设计模式系列之-策略模式(优化过多代码if…else)

首先解释下什么策略模式 如下图&#xff1a; 简而言之&#xff1a;算法的使用与算法的实现分离开来 想象有一个开关按钮&#xff0c;每次按下去都可以切换不同的灯光模式&#xff08;例如&#xff1a;强光、柔光、闪烁&#xff09;&#xff0c;这里的每种灯光模式就是一个策略…

程序人生——Java中基本类型使用建议

目录 引出Java中基本类型使用建议建议21&#xff1a;用偶判断&#xff0c;不用奇判断建议22&#xff1a;用整数类型处理货币建议23&#xff1a;不要让类型默默转换建议24&#xff1a;边界、边界、还是边界建议25&#xff1a;不要让四舍五入亏了一方 建议26&#xff1a;提防包装…

Unity类银河恶魔城学习记录8-5 p81 Blackhole duration源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码、 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Blackhole_Skill_Controller.cs using System.Collections; using Syste…

UL1642标准_锂聚合物电池亚马逊测试报告

UL1642标准_锂聚合物电池亚马逊测试报告 什么是锂聚合物电池UL1642标准&#xff1f; UL1642 认证要求涵盖旨在用于技术人员可更换或用户可更换应用的锂离子电池。UL1642 认证要求是为了避免锂离子电池在产品中工作时发生火灾或爆炸的风险。 锂聚合物电池 UL是Underwriters L…

Devin:首位人工智能软件工程师的介绍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2024春招看了上百份程序员简历,这个工具写的简历最好!(附模板)

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

DataWhale公开课笔记2:Diffusion Model和Transformer Diffusion

Stable Diffusion和AIGC AIGC是什么 AIGC的全称叫做AI generated content&#xff0c;AlGC (Al-Generated Content&#xff0c;人工智能生产内容)&#xff0c;是利用AI自动生产内容的生产方式。 在传统的内容创作领域中&#xff0c;专业生成内容&#xff08;PGC&#xff09;…

Python数值方法在工程和科学问题解决中的应用

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 随着计算机技术的不断发展&#xff0c;Python作…

UI设计中的图标的分类,功能性图标

图标的分类 既然知道了图标的作用和重要性&#xff0c;那么接下来&#xff0c;就要进一步了解在工作中我们要设计哪些图标。图标可以划分成三种大类:功能性图标、装饰性图标、启动图标。 功能性图标 功能图标是具有指代意义且具有功能标识的图形&#xff0c;它不仅是一种图形&a…