性能测试-数据库优化二(SQL的优化、数据库拆表、分表分区,读写分离、redis、数据库监控)

news2025/1/18 7:25:58

数据库优化

explain select

重点: type类型,rows行数,extra

SQL的优化

  • 在写on语句时,将数据量小的表放左边,大表写右边
  • where后面的条件尽可能用索引字段,复合索引时,最好按复合索引顺序写where条件
  • where后面有in语句,in字段的索引,最好放复合索引的后面,因为in的字段索引可能会失效
  • 模糊查询时,尽量用 常量开头,不要用%开头,用%开头查询索引将失效
    • select * from table where col like ‘明确%’;
  • 尽量不要使用 or,否则索引失效
  • 尽量不要使用类型转换(显式、隐式),否则索引失效 如果主查询数据量大,则使用in;
  • 如果子查询数据量大,则使用exists
    • select * from table_1 where id in(数据量小);
  • 查询哪些列,就根据哪些列group\order by,不然会产生一个临时表
  • 写select,尽可能的不用 *

实际项目中sql的优化:

  • 获取慢sql
    • 并发时候是慢sql
    • 单独执行就是慢sql
  • 执行sql
  • 简单分析
    • 简单分析
    • 复杂的sql(行数在几十行)
      • 先梳理sql的业务
        • 业务的梳理,可以拆解sql
      • 复杂sql能用代码实现的,尽可能用代码来实现

数据库的优化

数据库库层面优化:

  • 数据库的配置参数、
  • 操作系统参数、
  • 磁盘

数据库表层面优化

  • 表的存储引擎
  • 建表的时候字段数量及字段类型
  • 建索引,一般情况下mysql表的索引,一张表不超过5个 
  • 建视图表
    • 内存表,不磁盘上
  • sql优化

数据库拆表

数据库表中数据,产品使用一段时间会后,某些表的数据量的数据量就可能很大。同时数据库对于产品正常非常重要,万一数据库有问题了,导致产品无法正常使用,数据库还需要备份。

备份:一般会备份到其他地方

  • 冷备份:指定一个备份规则,满足规则的时候做备份。
    • 如:凌晨一两点、产品用户使用率最低的时候。
  • 热备份:几乎实时对数据库的数据变更进行备份。
    • 读写分离、主从同步

读写分离、主从同步

读写分离

主从同步:数据库,至少是两个以上。多个数据库,一般是在不同的机器

读写分离:读数据和数据变更实在不同的数据库中。

读、写,哪个用主数据库,哪个用从数据库?-------思考

实操: 在一台机器中,用docker创建多个数据库  详细搭建教程看这里

docker run -itd --name mysql-1 -p 3366:3306 -e MYSQL_ROOT_PASSWORD=123456
mysql:5.7
docker run -itd --name mysql-2 -p 3377:3306 -e MYSQL_ROOT_PASSWORD=123456
mysql:5.7
docker run -itd --name mysql-3 -p 3388:3306 -e MYSQL_ROOT_PASSWORD=123456
mysql:5.7

修改数据的配置文件,在配置文件中,设置数据库的服务id和日志同步文件格式,有多个数据库,数据 库的id不相同,id值越大,将来作为从数据库。

server-id=100
log-bin=mysql-bin

登录准备作为从数据库的数据库,添加主数据库的信息,添加成功之后,从数据库才知道主数据库是哪 个?

CHANGE MASTER TO
MASTER_HOST='192.168.130.130',
MASTER_PORT=3366,
MASTER_USER='root',
MASTER_PASSWORD='123456';
START SLAVE;
show slave status;

看执行的结果  Slave_SQL_Running  Slave_IO_Running的值为Yes。

Slave_IO_Running:意思是二进制文件同步正在运行。Yes,就会从主数据库自动同步数据库二进制 文件到从数据。No,就不会同步文件

Slave_SQL_Running:二进制日志回放,正在运行,执行sql,Yes,同步过来的文件,就会执行。No, 同步过来的文件,也不会执行。

数据同步,只能是主数据库同步给从数据库,不能反过来。

在主数据库做的任何操作,都可以同步给从数据库,从数据库的数据变动,是不能同步给其他从数据库和主数据库的

从数据库改了数据,主数据库中新增一条新数据,还是可以同步给从数据库的,但是如果主数据库改了从数据库相同的数据,导致了从数据库冲突,冲突之后导致所有数据都不能同步过来。只能解决冲突才能再次同步(删除对应的数据并不能解决冲突)

所以数据变更是在主数据库,获取数据是在从数据库。 从数据库是用来读数据,主数据库是用来写数据的。

主从同步

企业中项目,70%的性能问题,都会与数据库有关。

项目中,从数据库中获取数据的使用率,远远高于进行数据变更的。

实现数据库读写分离的话,那么,进行数据变更,获取数据,就可以从不同的数据库中获取。这样,获 取数据的性能会要更高一些。

主从同步,至少要有两个以上的数据库。主数据库,主要是做数据变更,从数据库,数据会自动从主数 据库同步过来。这样就可以保障主从数据库的数据一致。读的时候,使用从数据库数据,数据不会错,变更数据,使用主数据库,这样一旦数据发生变化,自动同步给从数据库,获取数据是从从数据 库中获取,所以从数据库的数据,也是变更之后的数据。

从数据库可以是多个。多个从数据库,可以配置为集群。项目中,jdbc的url地址,就配置数据库的集群地址,这样项目就可以实现从多个从数据库中获取数据。这样获取数据的性能就提升了。

使用主从同步,读写分离,在企业项目中,是比较常见的。使用之后,数据库的性能也是可以得到明显 的提升。

分表分区   

-详细看这里

分表

分表:拆表垂直拆表,水平拆表

拆表拆出来的子表,都是真实的物理表,表中数据,是落在磁盘上的。每个表在磁盘上的文件变小,表 的性能就提升了。

  • 垂直拆表:根据一定的策略,把表的列拆分。
    • 策略:如,根据sql语句中,使用率高低
  • 水平拆表:根据一定的策略,把表的行数量拆分
    • 策略:如,根据id的尾号

合表:主表(是一张虚拟表,不再磁盘上)的存储引擎是MRG_MYISAM,子表存储引擎必须为MYISAM。 mysql数据库中InnoDB存储引擎,不支持合表

分区

数据库表的数据落入磁盘时,写入不同的磁盘分区上去。

可以是一张表,根据一定的策略,把满足策略的数据,写入到不同硬盘的分区上。

也可以是数据库中的多张表,不同的表写入到不同的硬盘分区上。

写到不同的硬盘,每个硬盘都有自己的IO,写到不同的硬盘,就可以使用不同硬盘的IO性能

分区可以把表数据,落到磁盘上的文件变小,同时也可以使用不同硬盘IO性能,所以数据库表 分区对性能提升是很大的。

但是这种方法在企业中相对主从同步用的少一些。

主要原因:

  • 成本,做数据表的分区,一般要使用RAID磁盘矩阵
  • 技术,RAID技术、数据库分区的技术、数据恢复技术

总结关系型数据库性能优化

1、数据库是一个软件,是安装在操作系统中

  • 优化:操作系统优化(硬件、系统参数)、数据库自身参数优化
  • 优化:主从同步

2、数据库的建库、建表

  • 优化:建表的存储引擎、字段类型、字段数量、表索引,关联表、建视图
  • 优化:分表分区

3、数据库的使用

  • 优化:sql优化
  • 优化:读写分离

4、补充:现在数据库越来越多,出现了分布式数据库。TiDB

非关系型数据库

是相对于关系型数据库而言的,关系型数据库,表与表之间是有关联关系的。非关系型数据库,就是说表与表之间,没有明确的关联关系。

关系型数据库,表是二维表,把数据进行了栅格化。但是非关系型数据库,没有对数据进行统一的 标准化的格式化。

关系型数据库,统一标准的sql语句,非关系型数据库,没有统一标准的sql,各个不同的非关系型数据 库,都有自己的独立的sql语句。

总体的情况是非关系型数据库,数据结构虽然没有关系型数据库那么清晰,但是性能和数据扩展性 要远远高于关系型数据库。

现在企业项目数据库,一般会选择:关系型数据库为主数据库,非关系型数据库为辅助数据库,这种 多数据库组合的方式。

在企业项目中,redis作为缓存数据库是最常见的。

因为:redis数据库,是一个内存数据库,它的数据是保存在内存中,但是它又有一个自动同步磁盘的机制,可以根据设定的配置项目,自动间隔一段时间把内存中的数据写入磁盘。redis数据库可以实 现缓存集群。

性能测试学习redis:

  • 是内存数据库,性能是比较好的,至少它的性能比磁盘数据库的性能要高。
  • 也会存在性能问题。------→性能测试经历中,有见过接口响应时间规律性忽高忽低,这种情况很 大概率就是redis性能问题

redis的安装与使用

redis的安装一

redis是6.x版本,这个版本要求GCC要大于5.3版本。

GCC是linux系统中,编译安装系统软件的必须的库,这个库linux中可以直接安装。centos7系统,默认直接安装的版本是4.8.5版本。来安装redis6.x版本会报错。

# centos7系统
# 安装gcc
yum install gcc* -y
# 可以使用 gcc -version 来查看gcc的版本
yum -y install centos-release-scl
# 可以使用 yum search devtoolset-* 来查看,当前系统可以安装的gcc的版本
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

安装redis

wget http://download.redis.io/releases/redis-6.0.8.tar.gz
tar -xzvf redis-6.0.8.tar.gz
cd redis-6.0.8
make
在当前这个路径下,redis.conf文件,就是redis的配置文件
在src路径下会有一些可执行的文件
使用 src/redis-server 启动了redis,但是,此时redis不是守护进程

daemonize no   在redis默认情况下守护进程为no,不是守护进程

redis的安装二

安装的redis是6.x版本,gcc需要升级到5.3以上

  • 升级gcc
  • 解压redis包

配置项:

  • protected-mode yes   默认是开启包含模式,如果开启了,用代码调用redis会报错,如果设置为 no,就可以不用密码连接redis
  • daemonize  yes 就是守护进程

使用 src/redis-cli 命令可以连接到redis的命令行模式

config get * 可以查看到所有的redis的配置信息

做性能测试,要懂得redis的安装、redis的配置,redis的使用要了解。

redis的使用

  • redis有5种常用数据类型,以及这些类型是基本使用。
  • string字符串类型 ----→ 值为string
    • set 设置key和value,get获取key的值
  • hash类型
    • hmset key filed1 value1 flied2 value2 filed3 value3……
    • hget key filedname
  • list类型
    • lpush key value1 value2 value3…..   往列表的左边插入数据
    • lrange key start end 从列表的左边开始取值
  • set集合 数据不会重复
    • sadd  key value1 value2
    • smembers 
  • sorted set有序集合
    • zadd 添加数据
    • zrangebyscore 获取数据

redis是内存数据库,性能要比磁盘数据库性能要好很多。所以一般情况下不会有性能问题。

redis本身数据类型的操作的信息是非常快的。redis自带了一个性能测试工具,这个工具模拟对redis 进行数据操作

redis-benchmark

src/redis-benchmark --help
src/redis-benchmark -n 300000 -q

redis的性能问题

主要的原因,redis数据需要设置一个有效时长,如果不设置这个key对应value就会一直存在redis数据库中,redis是一个内存数据库,随着使用时间越来越长,如果没有给key设置一个失效时长,内存总会出现不够用的情况。所以要给key设置一个有效时长。但是如果这个有效时长设置的不合理,就可能导致问题。

  • redis的穿透
    • redis是一个缓存数据库,是用于缓存从磁盘数据库中获取到数据,减少从磁盘获取数据的次 数,提高获取数据的速度。
    • redis的穿透,是获取数据的时候,我们key是非法的,永远不存在的。获取key的值时,从 redis是永远拿不到值,就要去后面的磁盘数据库中获取,对磁盘数据库造成了很大的压力, 设置可能导致磁盘数据库宕机。
      • 解决:在代码中,对非法的key进行处理就可以了。
  • redis的击穿
    • 持续一段时间内,有大量的请求,集中在少量的key上面,当key失效的时候,瞬间请求到了 后端磁盘数据库,导致后端磁盘数据库瞬间压力非常大。
      • 解决:限量
  • redis的雪崩
    • redis中key是有一个失效时间,在同一个时间点里,有大面积的key失效,请求这些key的时 候,都请求到了后端磁盘数据库。
      • 解决:redis设置key的失效时间随机

数据库监控

监控还是使用grafana+Prometheus+exporter监控

MySQL监控

两种:

  • docker方式来监控数据库 
[root@vircent7 ~]# docker run -itd --name mysqld_exporter -p 9114:9104 -e
DATA_SOCRCE_NAME="root:123456@(192.168.130.130:3337)" prom/mysqld-exporter
  • mysqld_exporter包监控
    • 数据库是直接安装在centos7系统中  /etc/my.cnf配置文件
    • 在数据库的机器上,放置mysqld_exporter文件 https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0- rc.0/mysqld_exporter-0.15.0-rc.0.linux-amd64.tar.gz
    • 解压
    • 修改数据库的配置文件/etc/my.cnf
[client]
host=ip地址
port=3306
user=
password=

启动mysqld_expoter:    ./mysqld_exporter --config.my-cnf="/etc/my.cnf"

修改Prometheus.yml

- job_name: 'mysql'
static_configs:
- targets: ['mysql的ip:9104']

启动Prometheus: ./prometheus

启动grafana: systemctl restart grafana-server

登录grafana,引入的模板是  7362

redis监控

下载redis_expoter   https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0- rc.0/mysqld_exporter-0.15.0-rc.0.linux-amd64.tar.gz

解压,启动redis: ./redis_expoter -redis.addr redis的bind地址

修改Prometheus.yml

- job_name: 'redis'
static_configs:
- targets: ['redis的ip:9121']

重启Prometheus 登录grafana,

引入的模板 763

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

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

相关文章

LeetCode 57—— 插入区间

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 第一步,我们先寻找新区间和原始区间列表的重叠部分。 假设新区间为 [ x 1 , x 2 ] [x_1, x_2] [x1​,x2​],原始区间列表中的其中一个区间为 [ y 1 , y 2 ] [y_1, y_2] [y1​,y2​]&…

C++学习 <day1-C++介绍基础>

一、什么是C 1. C介绍 C由程序员控制生命周期(性能提升);C数据存储等方式由硬件决定(性能提升); C11 引入了 type_traits/range; C17 删除了 auto_ptr; 二、C开发环境&相关工…

数据库锁等待排查方法、命令行安装数据库及授权文件更新

欢迎关注“数据库运维之道”公众号,一起学习数据库技术! 本期将为大家分享“数据库锁等待排查方法、命令行安装数据库及授权文件更新”的运维技能。 关键词:锁等待、V$LOCK、V$TRXWAIT、死锁、锁超时、命令行部署达梦、授权文件更新 当用户反馈执行SQL语…

“开关是灯的日出日落,日出日落是灯的开关”

C语言刷题 day01 本篇是C语言刷题大杂烩,收集了笔者遇到的认为有价值的题目,本篇会持续更新~~ day01 至少是其他数字两倍的最大数 题目原文: 题意解析: 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 …

Spring Cloud+Uniapp 智慧工地云平台源码 智慧工地云平台AI视频分析应用

目录 AI应用与环境治理 设备管理与危大工程 塔吊安全监管 智慧工地APP端 智慧工地硬件设备 智慧工地主要功能模块 智慧工地可以通过以下几个方面为建筑行业赋能: 1.提高工程效率 2.提高工程安全性 3.提高工程质量 4.提高工程管理效率 绿色施工 质量管理…

C++之类和对象二

目录 1.类的6个默认成员函数 2. 构造函数 3.析构函数 1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下,都会自动生成下面6个默认成员函数。 clas…

国民经济行业导入数据库码表

目录 1、先去下载word文档图片如下 2、粘贴到excel中形成insert 语句 3、创建临时表存excel中数据 4、创建码表保存信息 5、编写存储过程放入表中 5.1存储第四级码值及父机构 5.2存储第三级码值及父机构 5.3存储第二级码值及父机构 5.4存储第一级码值 6、导入成功查看…

1.微服务介绍

完整的微服务架构图 注册中心 配置中心 服务集群 服务网关 分布式缓存 分布式搜索 数据库集群 消息队列 分布式日志服务 系统监控链路追踪 Jenkins docker k8s 技术栈 微服务治理: 注册发现、远程调用、负载均衡、配置管理、网关路由、系统保护、流量…

【学习】测试新项目该如何高效的展开测试?需要做哪些规划?

当我们收到测试项目时,如何高效地展开测试是我们作为测试人员所要面临的一大挑战。测试是软件开发过程中不可或缺的一环,它确保了产品的质量,降低了出现问题的风险,提高了用户的满意度。因此,我们需要制定合理的测试计…

前端三剑客 HTML+CSS+JavaScript ① 基础入门

光永远会照亮你 —— 24.4.18 一、C/S架构和B/S架构 C:Client(客户端) B:Browser(浏览器) S:Server(服务器) C/S 架构: B/S 架构: 大型专业应用、安全性要求较高的应用,还…

2024华中杯C题完整论文讲解(含完整python代码及所有曲率插值和坐标数据表格)

大家好呀,从发布赛题一直到现在,总算完成了2024华中杯C题光纤平面曲线重构完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 共38页,一些修改…

2024年国内五大企业邮箱,哪个最靠谱?

电子邮件是企业办公的重要手段,目前我国五大企业的邮箱都有Zoho Mail公司邮箱、腾讯企业邮箱、阿里企业邮箱、网易企业邮箱、263公司邮箱。可是哪个电子邮件最可靠呢?可靠的企业邮箱必须要安全性高、稳定性高,能够保护企业的隐私不被泄露&…

【毕业设计】基于JAVA的两个通用安全模块的设计与实现(源代码+论文)

目录 1.说明 2.系统设计与实现 2.1总体结构图 2.2与数据库建立连接 2.3与数据库建立连接 2.4数字证书创建 2.5关键代码说明 1.说明 详细介绍基于口令的身份认证与文件安全传输两个通用安全模块的设计原理和实现过程,分析了当前口令保存的安全性,提出了…

噪声系数测试之增益法

提到增益法测试噪声系数,大家并不陌生,这是一种简洁的测试方法,精度不如Y因子法,但是在某些测试场合,比如只有频谱仪而没有噪声头时,且待测件具有非常高的增益时,就可以使用增益法测试噪声系数。 增益法测试噪声系数的连接示意图如图1所示,其思路为:DUT输入端端接50 …

2024的新宠儿——Mamba(3):Mamba的三大创新

mamba(其对应论文为:https://arxiv.org/abs/2312.00752,这是其对应的GitHub代码地址:GitCode - 开发者的代码家园),在语言、音频、DNA序列模态上都实现SOTA,在最受关注的语言任务上,Mamba-3B超越同等规模的Transformer,与两倍大的Transformer匹敌,并且相关代码、预训练模…

PR CC 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包,选择“解压到当前文件夹”。 打开解压后的文件夹,鼠标右击“Set-up”选择“以管理员身份运行”。 点击文件夹图标。” 点击“更改位置”。 更改完位置,点击“继续”。 软件正在安装,请耐心等待,谢谢…

3D打印随形水路:模具提质降本增效的利器

在科技飞速发展的时代,3D打印技术以其独特的优势,正在逐步改写传统制造业。其中,3D打印随形水路技术的出现,无疑是科技与制造领域的一次革命性结合。那么,随形水路的魅力究竟体现在何处呢? 随形水路&#x…

乡政府管理系统|基于Springboot的乡政府管理系统设计与实现(源码+数据库+文档)

乡政府管理系统目录 目录 基于Springboot的乡政府管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、活动信息管理 3、新闻类型管理 4、新闻动态管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

浅浅了解一下 LibTorch

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ LibTorch 是 PyTorch 提供的一个二进制发行版,包含了所有必要的头文件、库和 CMake 配置文件,便于开发者依赖 PyTorch 开发应用。用户可以从 PyTorch 官网下载包含最新 LibTorch…

Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术

Java全套智慧校园系统源码springbootelmentui Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术 智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园…