性能测试-数据库

一、数据库事务机制

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请求,由其他从服务器进行处理

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

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

相关文章

【2024-03-12】设计模式之模板模式的理解

实际应用场景:制作月饼 过程描述: 一开始,由人工制作月饼, 第一个:根据脑子里面月饼的形状,先涅出月饼的形状,然后放入面粉和馅料把开口合并起来。 第二个:根据脑子里面月饼的形状&…

BigDL-LLM 安装指南——在iGPU集成显卡下使用BigDL-LLM大模型库加速LLM

文章目录 iGPU是什么?一、环境准备1.1 Visual Studio 2022 Community 安装1.2 安装或更新最新版本的GPU驱动程序1.3 安装英特尔oneAPI工具包2024.0版本1.4 安装Anaconda 二、BigDL -LLM 安装2.1 创建虚拟环境2.2 激活虚拟环境2.3 安装bigdl-llm[xpu] 三、运行环境配…

iOS 17.4 Not Installed

iOS15以后,下载了xcode安装好后,并不会自动下载好模拟器,需要手动下载。 有两种下载方式 xcode下载 xcode -> Settings 打开面板 xcode下载虽然方便,但是有个问题是,这里下载如果断网了不会断点续传,…

MyBatis 框架之一:简介及环境搭建详细步骤

1. MyBatis 是什么? MyBatis 是一个流行的、轻量级的 Java 持久层框架,它简化了与数据库交互和 SQL 映射的过程。MyBatis 取代了 JDBC 原始 API 的大量繁琐工作,允许开发者将更多的精力放在业务逻辑上而不是处理数据访问细节。 mybatis 是一款…

激光雷达研究笔记1:资料整理与学习_windows机对其评估使用

到手了一款型号为LDROBOT LiDAR LD19 的单线激光雷达模块,现对其进行学习使用: 1.对产品手册的研究: 通读产品手册后,我提炼了几方面有用的信息: 1.测量依据: 以下是激光雷达点云扫描示意图: 上…

Linux信号机制(二)

目录 一、信号的阻塞 二、信号集操作函数 三、sigprocmask函数 四、pause函数 五、sigsuspend函数 一、信号的阻塞 有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。…

【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

Qt配置OpenCV,无需编译

网上很多关于Qt配置OpenCV的教程都需要下载CMake编译Opencv,但是这种做法出错的概率很大,很多时候会受CMake或者Opencv版本的影响,又或者是没有使用Qt自带的Cmake-gui.exe程序,我在编译的时候也是频繁出错。 本文推荐的方法是使用…

【EDK II】作为UEFI的实现,EDK II 的架构是什么样的

目录 前言 EDK II 架构 配置文件 结语 前言 基本输入输出系统 (Basic Input Output System, BIOS) 最早由 IBM(International Business Machines Corporation) 公司于1981年提出并开发,后来成为个人计算机(PC)的标准固件接口。但受限于传统BIOS (Le…

MySQL的用户管理以及权限设置

用户管理 账户管理 我们在数据库里面创建用户,修改用户,删除用户,本质上就是对mysql数据库下的user表进行增删查改,用户的所有信息都存在这张表里,我们想要创建用户可以往user表insert,删除用户可以delet…

【Java基础概述-10】IO流、字节流、字符流、缓冲流、转换流、序列化、打印流、Properties属性集对象

目录 1、IO流概述 2、字节流的使用 2.1、FileInputStream字节输入流 2.1.1、读取方式一 2.1.2、读取方式二 2.1.3、字节流读取数据如何避免中文乱码 2.2、OutputStream字节输出流 2.3、案例:复制粘贴小案例 3、字符流 3.1、FileReader字符输入流 3.1.1、读…

打卡学习kubernetes——kubernetes架构原理

接上一篇的内容,除了核心组件,还有一些推荐的Add-ons: kube-dns 负责为整个集群提供DNS服务Ingress Controller 为服务提供外网入口Heapster 提供资源监控(没用过这个,但是用过grafana,很方便&#xf…

MySQL的事务隔离是如何实现的?

目录 从一个例子说起 快照读和当前读 事务的启动时机和读视图生成的时刻 MVCC 隐藏字段 Undo Log回滚日志 Read View - 读视图 可重复读(RC)隔离级别下的MVCC 读提交(RR)隔离级别下的MCC 关于MVCC的一些疑问 1.为什么需要 MVCC ?如果没有 MVCC 会怎样&am…

ov多域名SSL数字证书1200元一年送一月

随着互联网的发展,不论是个人用户还是企事业单位都不止有一个网站,为了保护网站安全,就需要为网站安装SSL证书,而SSL证书中的通配符SSL证书和多域名SSL证书都可以同时保护多个域名站点。其中,多域名SSL证书可以同时保护…

POS 之 验证者如何才能提议区块

验证者提议区块 验证者帐户提议区块。 验证者帐户由节点运营商(可以是AWS等待云服务商)管理,节点运营商运行验证者软件作为其执行和共识客户端的一部分,并且已经向存款合约中存入了至少 32 个以太币 然而,每个验证者只是偶尔负责提议一个区块…

jvm题库详解

1、JVM内存模型 注意:这个是基于jdk1.8之前的虚拟机,在jdk1.8后 已经没有方法区,一并合并到堆中的元空间了 JVM内存区域总共分为两种类型 线程私有区域:程序计数器、本地方法栈和虚拟机栈 线程共享区域:堆&#xff08…

android MMKV数据持久化缓存集合

前言 最近在使用mmkv缓存的时候 发现没有集合缓存 非常不方便 自己写一个方法 MMKV public class MmkvUtils {private MmkvUtils() {throw new UnsupportedOperationException("u cant instantiate me...");}public static void init() {MMKV.initialize(LeoUtils…

脚本.py文件转.exe文件遇见的问题,打开exe文件出现弹窗: No module named ‘xxx‘

目录 1 问题2 问题分析3 解决过程3.1 确保Pillow库存在3.2 迷惑阶段3.3 解决问题 4 希望大佬解答 1 问题 今天做了一个使用Python写的脚本文件.py,打算把它转换成.exe文件。点击生成的exe文件时,出现了如下弹窗。 2 问题分析 根据错误描述&#xff1…

国际黄金在哪里买?

国际黄金可以在以下几个主要的市场和渠道进行购买: 1. 黄金交易所:国际上有多个黄金交易所,其中最知名的是伦敦金属交易所(London Bullion Market Association,简称LBMA)。LBMA是全球最大的黄金交易市场&am…

Arrays --Java学习笔记

Arrays 用来操作数组的一个工具类 Arrays类提供的常见方法: 代码演示: import java.util.Arrays; import java.util.function.IntToDoubleFunction; import java.util.function.IntUnaryOperator;public class Arrays类 {public static void main(Str…