十、性能测试之数据库测试

news2024/11/25 21:26:08

性能测试之数据库测试

      • 一、 数据库分类
      • 二、 mysql安装及密码的修改
        • 1、安装:数据库的版本 mysql5.7版
          • 方法1:直接安装
          • 方法2:使用rpm包安装
          • 方法3:docker方式安装
        • 2、修改数据库的密码
        • 3、创建库
        • 4、创建表
      • 三、存储引擎
        • 1、InnoDB
          • 特点
        • 2、MyISAM
          • 特点
        • 不同的引擎及其介绍
      • 四、索引
        • 1、简介
        • 2、优势和弊端
        • 3、分类
          • 1、主键索引: id(有且只有一个)
          • 2、唯一索引: 不可重复,只有NULL可以重复且可以有多个
          • 3、复合索引: **多列**的名称一起建立一个索引,列的字段是有顺序
      • 五、 数据库在磁盘的展示
      • 六、B树索引
        • B+树(balanceTree平衡树)的优点:
      • 七、视图
        • 1、概念
        • 2、作用
        • 3、用法
      • 八、数据查询解析过程
        • 1、数据库解析过程
      • 九、影响数据库性能的因素总结
      • 十、数据库的性能优化
        • 1、操作系统优化
        • 2、库的优化
          • 数据库常用配置参数及其含义含义
      • 十、性能优化实操
        • 1、分析慢查询
        • 2、数据库连接不够用

一、 数据库分类

  • 1、关系型数据库:如mysql
  • 2、非关系型数据库:如redis

二、 mysql安装及密码的修改

  • 1、安装:数据库的版本 mysql5.7版

    • 现在企业中mysql版本,大多在mysql5.7
    方法1:直接安装
    最简单, 但是因为网络的原因,要下载,可能时间会比较长
rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

# 安装mysql-server
yum install mysql-community-server -y

# 启动数据库
systemctl restart mysqld

# 配置开机自启动
systemctl enable mysqld
方法2:使用rpm包安装

速度很块,但是,包有先后顺序的依赖关系

方法3:docker方式安装

速度很快,但是,需要有docker的技能

  # 安装docker
  yum install -y yum-utils device-mapper-persistent-data lvm2
  curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyuncurl -sSL 
  # 重启docker 
  systemctl restart docker
  # 配置开机自启动
  systemctl enable docker
  # 安装mysql并配置相关信息
  docker run -itd --name mysql -p 3337:3306 -e MYSQL_ROOT_PASSOWORD=123456 mysql:5.7
  • 2、修改数据库的密码

    • 通过 grep "password" /var/log/mysqld.log 可以找到密码,但是这个密码是高复杂度的密码,这个密码不好记忆

    • 我们想要修改为低复杂度好记忆的密码

    • 修改 mysql数据库的配置文件 /etc/my.cnf

      • 这个路径,是直接安装mysql数据库方式的 数据库的配置文件路径
      • 在[mysqld]节点下
      [mysqld]
      
      validate_password_policy=0	# 设置为 弱密码
      validate_password=off	# 关闭密码策略
      
      character_set_server=utf8
      init_connect='SET NAMES utf8'
      
      

      重启动mysql: systemctl restart mysqld

      进入mysql客户端 mysql -uroot -p 回车

      # 修改密码
       alter user 'root'@'localhost' identified by '123456';
       # 赋权
       GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
       # 刷新权限
       FLUSH PRIVILEGES;
       # 退出
       exit;
      

      mysql的默认端口 3306

    • 3、创建库

    • 4、创建表

    • 三、存储引擎

      • 1、InnoDB

        • 在mysql5.5以后版本,默认存储引擎InnoDB
        • 特点
          • 事务优先型,行锁(每次锁定一行,只有锁被释放才能再次修改),索引使用的是B树
      • 2、MyISAM

        • 5.5以前是MyISAM[maiˈzæm]
        • 特点
          • 性能优先,表锁(每次锁定一张表),索引有B树、hash索引
      • 不同的引擎,有不同的性能。所以我们在建表的时候,要合理的选择存储引擎。
      • 不同的引擎及其介绍

存储引擎描述
ARCHIVE用于数据存储的引擎,数据被插入后就不能再修改了,且不支持索引,行锁,占用磁盘少;常用语日志系统,大量的设备数据采集
CDV在存储数据时,会以逗号作为数据项之间的分隔符;常用语数据库的快速导出导入,表格转换为CSV
BLACKHOLE会丢弃写操作,该操作会返回空内容
FEDERATED将数据存储在远程数据库中,用来访问远程表的存储引擎
InnoDB默认,5.5版本后新增,具备外键支持功能的事务处理引擎,事务优先,行锁,支持B树索引
MEMORY置于内存的表,速度快,但安全没保障,置于16M,不支持大数据存储类型,表锁;常用语等值查找热度较高的数据
MERGE/MRG_MYISAM用来管理由多个MyISAM表构成的表集合
MyISAM5.5版本之前默认引擎,主要是非事务处理存储引擎,性能优先,表锁,支持B树,哈希索引
NDBMysql集群专用存储引擎
  • 建立好了表,表就会有多个字段,往里面写入数据。

    • 一般不建议在关系型数据库表中,填加过多字段(一般推荐2,30个字段以内)
    • 表列建立索引,主键,默认就是索引。
    • 四、索引

      • 1、简介

        • 是一种数据结构,用于帮助我们在大量数据中快速定位我们要查找的问题
        • 典型:汉语字典,书籍目录
        • 建索引:使用时间换空间,索引有一定大小,占磁盘/内存空间,以此来换取时间更少
        • 建立索引的目的,是加快数据查找速度。但在写入数据时,这一操作会使整个文件增大,导致修改速度变慢
        • 但是,在数据库的使用过程中,查找使用频率时远远高于修改频率,所以我们建表一般会建立索引。
      • 2、优势和弊端

        • 优势
          • 1、降低IO,CPU使用率
          • 2、索引列,可以保证行的唯一性
          • 3、可以有效缩短数据检索时间
          • 4、加快表与表之间的连接
        • 弊端
          • 1、索引本身很大,通常存在磁盘(也可以存在内存)
          • 2、不是所有的情况都可以用索引:数据量少\列值频繁变更\列很少使用
          • 3、索引会降低增删改效率,但是一般会提升查效率
      • 3、分类

        • 索引分为主键索引(primary key)、唯一索引(unique index)、复合索引
        • 1、主键索引: id(有且只有一个)
        • SQL: create index index_name on table_name(col_name); alter table table_name add index index_name(col_name);
        • 2、唯一索引: 不可重复,只有NULL可以重复且可以有多个
        • SQL:create unique index index_name on table_name(col_name)
        • 3、复合索引: 多列的名称一起建立一个索引,列的字段是有顺序
        • SQL: create index index_name on table_name(col_1,col_2......)
          • 复合索引,字段顺序非常关键,你在使用时,就一定要按照它的顺序来,如果不是按照它的顺序,那么你就没有使用这个复合索引
          • 举例:
            • st_student (col1,col2,col3,col4,col5,col6)
            • fhindex (col1, col3, col4)
              • 顺序:
                • col1 --> col3 —col4
                • col1 —> col3
                • col1
            • sql的where条件,就一定要按照fhindex的顺序
              • where条件
                • 1: col1=?,col2=? ×
                • 2: col1=?,col3=?
                • 3: col1=?, col3=?, col4=?
                • 4: col1=? col4=?, col3=? ×
                • 5: col3=?, col4=? ×
                • 6: col1=?, col4=? ×
                • 7: col1=?
                • 8: col3=? ×
                • 9: col4=?, col3=? ×
  • 五、 数据库在磁盘的展示

    建立了数据库和表之后,在/var/lib/mysql路径下,就有数据库名称文件夹
    在这里插入图片描述
    在这里插入图片描述

    • 文件夹中,就有表名称的文件
    • Innodb
      • ibd文件,这个表是InnoDB存储引擎时, 数据文件
      • frm文件,就是表结构文件
    • MyISAM
      • frm文件,表结构文件
      • MYD文件,数据文件
      • MYI文件,索引文件

    六、B树索引

    在这里插入图片描述

    mysql数据库使用InnoDB存储引擎,默认使用B+树索引

    • InnoDB存储引擎支持:B+树索引、全文索引、哈希索引,默认是B+树索引
    • 可以理解为二叉树,进行旋转而建立一个立体的二叉树集
    • B+树(balanceTree平衡树)的优点:

      • 树的层次更低,IO次数更少
      • 每次查询的结果都是在叶子节点,查询性能稳定
      • 叶子节点形成链表,范围查询方便
    • 注意:与存储过程的区别
      • 存储过程:是一组为了完成特定功能的sql语句集合,是一个可编辑的函数
      • 存储引擎:数据库文件的存储机制,表的类型
    • 七、视图

      • 1、概念

        • 虚拟表,从一个表或多个表中查询出来的表,作用和真实表一样,包含一系列带有行和列的数据。视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记录,视图可以使用户操作方便,并保障数据库系统安全
      • 2、作用

        • 缩减脚本复杂度,提升性能
      • 3、用法

        • 比如这张表长这样
          在这里插入图片描述
        • 新建报表:CREATE VIEW t_access_dataset_view AS SELECT *FROM t_access_dataset WHERE STATUS = "access"; (也可以指定具体字段,后面的查询的那个跟普通的sql语句写法一样的)
        • 关闭该数据库然后重新进入以后在报表那边可以看到
          在这里插入图片描述
        • 打开表
          在这里插入图片描述
        • 后续如果需要在这个的基础上进行过滤,直接查询这个视图就好啦
          在这里插入图片描述
        • 而且如果原表数据更新了,这边的视图也会更新哦,比如原表新增了这个
          在这里插入图片描述
        • 我们刷新下视图
          在这里插入图片描述

      八、数据查询解析过程

      • 1、数据库解析过程

      在这里插入图片描述
      在这里插入图片描述
    • 查询语句的解析过程:
      • from 表
      • where 条件 过滤数据 --> 条件,影响性能
      • group by 查询结果条件来分组 -->列没有变化
      • having <expression> 过滤分组 -->在上一步基础上进行过滤
      • select 字段 -->这一步的时候,列的数量才会变化
      • order by 字段 --> 排序。如果order by的字段不在目前现有的字段里面,会产生一个临时表,是非常消耗性能的,不推荐(回表查询)
      • limit 数量限制
  • 九、影响数据库性能的因素总结

    • 1、表的存储引擎
    • 2、表的字段(字段越多性能越差)
    • 3、表的索引
    • 4、sql语句,where条件
    • 5、sql语句,order by
  • 十、数据库的性能优化

    • 数据库的优化,两个方向: 操作系统+库的优化, 表+sql的优化
    • 数据库是用来存储数据的,必然有服务器磁盘操作,磁盘的读写速度也会影响性能。所以数据库的服务器,一般选择IO性能比较高,空间比较大的磁盘进行数据存储
    • 操作系统: 操作系统受打开文件数量(一般企业有个16000够用了)和缓存的限制很大
      • 1、操作系统优化

        • ulimit,可以看到这个只有1024就太小了,(临时修改,还必须重启)
          在这里插入图片描述
      • 2、库的优化

        • show variables: 查看系统相关参数的配置,大概有500+个配置
          在这里插入图片描述
      • 数据库常用配置参数及其含义含义
      在这里插入图片描述
    • 下面我们对常用参数进行说明:

      • 1、table_open_cache 数据表缓存
        • 数据库缓存有两种:
          • 数据库本身的缓存: 库本身 cache、buff
          • 缓存数据库: redis
          • 数据库本身的缓存大小是可以被配置,配置的越大,数据库要用的内存也就越大
      • 2、max_heap_table_size 是说 memory存储引擎表的大小为多少 默认16M
      • 3、slow_query_log 慢查询的开关
      • 4、slow_query_log_file 慢查询开关开启启,慢查询脚本会自动写入文件
      • 5、long_query_time 慢查询时间的阈值, 当sql的执行时间超过这个设定时间,就是慢查询。单位: 秒
        • 如何获取到慢查询脚本?
          • 生产环境中,默认是不会写慢查询日志的。
          • slow_query_log 这个开关默认是关闭的,就要开启这个开关
          • 开关开启之后,日志就根据long_query_time的时间去判断,超过这个时间,那么就会写入slow_query_log_file文件中去。
      • 可以试着查看下(这里不建议前面加%,这样性能不太好)
        在这里插入图片描述

        • 配置文件: /etc/my.cnf
        • 修改配置:
          • 1、set global var_name=var_value;
          • 2、修改配置文件

十、性能优化实操

1、分析慢查询

  • 慢查询日志
    • 慢查询日志,用来记录mysql中执行时间超过指定时间的查询语句,通过这个日志,可以看出哪些语句执行效率低下,需要优化。但是,开启该日志,会影响数据库性能,所以一般关闭
    • 慢查询日志,只是用于定义定位慢查询sql,并不是优化sql
  • 查看状态
    • show variables like ‘slow_query%’;
      • show_query_log 慢查询开启状态
      • show_query_log_file 慢查询日志存放位置
    • show variables like ‘long_query_time’;
      • long_query_file 慢查询的阈值,单位秒 阈值 阈值
  • 开始实战
    • 首先我们进入/etc/my.cnf,在mysqld下面然后修改,加上开启慢查询的语句,然后保存,重启数据库(systemctl restart mysqld;)。或者我们可以修改数据库的配置文件set global variable slow_query_log=ON/OFF; set global variable long_query_time=0.2;进行设置
      在这里插入图片描述
    • 然后我们就运行脚本产生慢sql。只有响应时间超过 long_query_time这个设置的时间,才可能出现慢sql
    • 在出现慢查询的日志后,我们可以到对应文件去查看(show VARIABLES like ‘%slow_query%’;可以看到对应文件夹)
      在这里插入图片描述

2、数据库连接不够用

  • 常见错误
    • mysql:ERROR 1040: Too many connections
    • 简单定位:可以拿一个navicat试一下,连不上就是连接数不够用
    • 定位:
      • show variables like ‘max_connections%’; --查看系统配置的最大连接数
      • show global status like ‘Max_used_connections’; --查看当前用户已经建立的连接数
    • 性能优化提升
      • 1、数据库配置连接数不够,修改max_connections值 set global max_connections=512;或者在配置文件中/etc/my.cnf修改。但是这边也不会调的过大,比如现在设置是151不够用,我们一般会设置为200,最多调到1000,要不然会导致内存消耗过多,效果也不大。调的时候可以参考innodb_open_file_limitopen_file_limit的数量。或者找运维和开发确认下
      • 2、程序性能上不去,修改程序配置文件
        • 服务器性能上不去,数据库连接足够用,此时,修改程序中数据库连接配置
参数用法
initialSize初始化连接数
maxActive连接池的最大连接数,0表示限制
maxIdle最大空闲连接,暂时不断开,随时待命
minLdle最小空闲连接
maxWait超时等待时间,毫秒;-1表示无限等待,直到超时

在这里插入图片描述

  • 但是这块数据通常是开发写在代码里,我们拿不到,我们只能通过应用服务器和数据服务器之间的网络连接数有多少来进行判断,具体脚本如下:

    • 配置文件

      • netstat -ano|grep 数据库端口 |grep ESTABLISHED |wc -l
        这个命令,在数据库机器中执行 看数据库当前总共有多少的连接数

      • netstat -ano|grep 数据库端口 |grep 应用程序ip |grep ESTABLISHED |wc -l
        这个命令,在数据库机器中执行后,就可以看到应用程序xxx与数据库建立连接数有多少

  • 然后再找开发要上图的配置文件进行对比,看看配置文件的参数配置是否太小,需要适当进行调整

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

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

相关文章

【Java 基础篇】Java字节打印流详解:处理二进制数据的利器

当你需要将数据输出到文件或其他输出目标时&#xff0c;Java中的字节打印流是一个非常有用的工具。本文将详细介绍Java字节打印流&#xff0c;包括它的基本用法、常用方法以及一些实际应用示例。 什么是字节打印流&#xff1f; 在Java中&#xff0c;字节打印流是用于将字节数…

【MATLAB】安装 shared_slreportgen_reportexplorer_common 时检测到以下错误

解决方法 下载matlab的时候以及安装的时候关闭杀毒软件。 然后也可以把simulink和DSP以及signal processing 相关的toolbox全部不勾选&#xff08;推荐&#xff09; 这两个工具箱没有其实没啥大的影响&#xff0c;就是信号处理这块的增强功能没有了 &#xff08;来自&#xff…

【Windows】你所使用的用户账户没有启用此任务的权限

【Windows】你所使用的用户账户没有启用此任务的权限 1. 故障现象 有一台腾讯云的服务器更新补丁,更新后需要禁用自动重启.发生了以下报错 2. 解决方法 2.1 下载pstools 工具下载地址 https://learn.microsoft.com/zh-cn/sysinternals/downloads/pstools 将软件复制到桌…

理解MTU VLAN与端口VLAN两个概念

什么是MTU VLAN MTU VLAN 是指将最大传输单元&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;设置为特定值以适应 VLAN 环境的配置。 MTU 是指在网络通信中可以传输的最大数据包大小。以太网的常见 MTU 值为1500字节&#xff0c;这是指在以太网帧中的数据…

【hudi】数据湖客户端运维工具Hudi-Cli实战

数据湖客户端运维工具Hudi-Cli实战 help hudi:student_mysql_cdc_hudi_fl->help AVAILABLE COMMANDSArchived Commits Commandtrigger archival: trigger archivalshow archived commits: Read commits from archived files and show detailsshow archived commit stats: …

<硬件设计>运放+三极管组成的恒流源VI电路设计与分析

目录 01 原理介绍&描述 运放的虚短和虚断 02 恒流源描述&分析 简单恒流源电路 简单恒流源电路描述 恒流源电路分析 恒流源VI电路 恒流源VI电路描述 恒流源VI电路分析 恒流源应用场景 03 恒流源VI电路示例 示例原理图&描述 恒流原理分析 恒流原理 恒…

毕业设计|基于51单片机的空气质量检测PM2.5粉尘检测温度设计

基于51单片机的空气质量检测PM2.5粉尘检测温度设计 1、项目简介1.1 系统构成1.2 系统功能 2、部分电路设计2.1 LED信号指示灯电路设计2.2 LCD1602显示电路2.3 PM2.5粉尘检测电路设计 3、部分代码展示3.1 串口初始化3.1 定时器初始化3.2 LCD1602显示函数 4 演示视频及代码资料获…

Java实现截取视频第一帧

目录 前言 一、通过Java借助第三方库实现 1.引用ffmpeg 使用maven&#xff0c;导入pom依赖&#xff1a; 工具类 2.引用jcodec 二、使用第三方存储自带的方法实现&#xff08;如阿里云OSS、华为云OBS&#xff09; 前言 在实际项目中&#xff0c;会遇到上传视频后&#xf…

SpringBoot轻松实现项目集成Knife4j接口文档

Knife4j 介绍 Knife4j 官网 Knife4j是一款基于Swagger生成API文档的增强工具&#xff0c;它简化了开发者构建和管理RESTful API文档的过程。通过自动扫描项目中的接口信息&#xff0c;Knife4j能够生成详细、易读的API文档&#xff0c;无需手动编写和维护。它提供交互式的接口调…

以太网传输距离以及延长办法

以太网传输距离与介质 以太网的标准传输距离取决于不同的以太网类型和传输介质。以下是一些常见的以太网类型和它们的标准传输距离&#xff1a; 以太网&#xff08;Ethernet&#xff09;&#xff1a;传输距离最长为100米&#xff0c;使用双绞线作为传输介质。 快速以太网&…

我的Qt作品(19)使用Qt写一个轻量级的视觉框架---第2章,实现思维导图方式的流程图运行

上次写的第1章介绍了主界面的设计。 https://blog.csdn.net/libaineu2004/article/details/130277151 本次是第2章&#xff0c;主要介绍流程图的运行。 本作品采用的是QtOpenCV组合方式开发。流程图的设计思想其实就是数据结构的【图】。通过遍历每个节点来执行各个算法。 1…

深度学习数据集的文本制作和读取

文章目录 制作数据集的文本文件读取文本文件 制作数据集的文本文件 import os from os.path import join import random import config args config.argsclass SplitDataset:def __init__(self):self.data_root_path args.data_root_pathself.dataset_split_rate args.data…

【网络应用与安全】第一次作业

文章目录 一、熟悉实验室运行环境1 - 登录2 - 熟悉Linux环境3 - 远程登录4 - 使用Git 二、网络延迟三、网络应用四、HTTP五、Network Port六、TCP Protocol七、实验室系统1 - LDAP2 - Kerberos3 - Ansible 八、Linux运行环境和Nginx1 - 安装Ubuntu22.04.3LTS版本2 - 安装Nginx3…

Linux:基础开发工具之yum,vim,gcc的使用

文章目录 yumvimgcc 本篇主要总结的是Linux下开发工具 yumvimgcc/g yum 什么是yum&#xff1f; 不管是在手机移动端还是pc端&#xff0c;不管是什么操作系统&#xff0c;当用户想要下载一些内容或者工具的时候&#xff0c;都需要到一个特定的位置进行下载&#xff0c;例如在…

图片格式大全

青春不能回头&#xff0c;青春也没有终点。 大全介绍 图片格式有多种&#xff0c;每种格式都有其独特的特性和用途。以下是一些常见的图片格式以及它们的介绍&#xff1a; JPEG&#xff08;Joint Photographic Experts Group&#xff09;&#xff1a; 文件扩展名&#xff1a;…

Whisper + NemoASR + ChatGPT 实现语言转文字、说话人识别、内容总结等功能

引言 2023年&#xff0c;IT领域的焦点无疑是ChatGPT&#xff0c;然而&#xff0c;同属OpenAI的开源产品Whisper似乎鲜少引起足够的注意。 Whisper是一款自动语音识别系统&#xff0c;可以识别来自99种不同语言的语音并将其转录为文字。 如果说ChatGPT为计算机赋予了大脑&…

解决flutter不识别yaml里面配置的git项目

解决办法找到相应的 git路径&#xff0c;然后手动 git pull 暂时先用这个笨方法&#xff0c;后面有更好的解决办法了再说 studio 自己拉取的项目里面没有ios 和lib包

知识付费平台开发技术实践:构建数字学习的未来

引言 知识付费平台的兴起正在塑造着数字学习的未来。本文将介绍一些关键的技术实践&#xff0c;帮助开发者构建强大的知识付费平台&#xff0c;提供出色的数字学习体验。 1. 选择适当的技术栈 在开始知识付费平台的开发之前&#xff0c;首要任务是选择适当的技术栈。这包括…

App测试中iOS和Android的差异

1、系统版本&#xff1a; iOS和Android系统版本的更新速度、使用人数比例以及功能的不同都可能导致应用程序在不同操作系统版本上的表现和兼容性存在区别。 例如&#xff0c;在iOS平台上&#xff0c;很多用户会更快地升级到最新版本的iOS系统&#xff0c;而在Android平台上&a…

如何用C语言实现 IoT Core

涂鸦 IoT Core SDK 使用 C 语言实现&#xff0c;支持涂鸦设备模型协议&#xff0c;适用于开发者自主开发硬件设备逻辑业务接入涂鸦。 功能概述 涂鸦 IoT Core SDK 提供设备激活、发送上下行 DP 和固件 OTA 升级等基础业务接口封装。SDK 不依赖具体设备平台及操作系统环境&…