性能测试(五)—— 数据库性能测试-mysql

1 mysql性能测试的主要内容

  • MySQL数据库介绍
  • MySQL数据库监控指标
  • MySQL慢查询工作原理及操作
  • SQL的分析与调优方法
  • MySQL索引的概念及作用
  • MySQL索引的工作原理与设计规范
  • MySQL存储引擎
  • MySQL实时监控
  • MySQL集群监控方案
  • MySQL性能测试的用例准备
  • 使用Jmeter开发MySQL性能测试脚本
  • 执行测试

2 mysql数据库分支介绍

MariaDb
  • MySQL之父Widenius创建,目标在于替换现有MySQL
  • 兼容MySQL ,对于开发者来说感知不到变化
  • ariaDB is free and open source software

3 mysql重点监控指标SQL语句

  • QPS

queries per seconds每秒钟查询数量

mysql > show global status like 'Question%';

  • TPS(每秒事务量)

TPS = (Com_commit + Com_rollback) / seconds

mysql > show global status like 'Com_commit';

mysql > show global status like 'Com_rollback';

  • 线程连接数

mysql > show global status like 'Max_ used_ connections';

mysql > show global status like 'Threads%';

  • 最大连接数

mysql > show variables like 'max_ connections';

  • Query Cache

查询缓存用于缓存select查询结果

当下次接收到相同查询请求时,不再执行实际查询处理而直接返回结

适用于大量查询、很少改变表中数据

 
修改my.cnf将query_ cache_ size设置为具体的大小,具体大小是多少取决于查询
的实际情况,但最好设置为1024的倍数,参考值32M增加一行: query_ cache_ type=0/1 / 2
如果设置为1 ,将会缓存所有的结果,除非你的select语句使用
SQL_ _NO_ CACHE禁用了查询缓存。如果设置为2 ,则只缓存在select语句中通过SQL _CACHE指定需要缓
存的查询.

  • Query Cache命中率

show status like 'Qcache%';

Query_cache_hits = (Qcahce_ hits /(Qcache_ hits + Qcache_inserts )) * 100%;

  • 锁定状态

show global status like '%lock%';

Table_ locks_ waited/Table_locks_immediate值越大代表表锁造成的阻塞越严重

  • 锁定状态

show global status like '%lock%';

Table_locks_waited/Table_locks_immediate值越大代表表锁造成的阻塞越严重

Innodb_ row_ lock_waitsinnodb行锁,太大可能是间隙锁造成的

  • 主从延时

查询主,从延时时间: show slave status

4 mysql慢查询

4.1 慢查询定义
  • 执行速度超过定义的时间的查询
  • 不同的系统定,义不容的慢查询指标
4.2 慢查询开启
  • 编辑/etc/my.cnf ,在[mysqld]域中添加: .
  • 开启慢查询: slow_query_log= 1
  • 慢查询日志路径: slow_query_log_file =/data/mysql/slow.log
  • 慢查询的时长: long_query_time= 1
  • 未使用索弓|的查询也被记录到慢查询日志中 log_queries_not_using_indexes=1
慢查询日志分析

mysqldumpslow命令

  • -s是表示按照何种方式排序
  • -t是top n的意思,即为返回前面多少条的数据
  • -g后边可以写一个正则匹配模式,大小写不敏感的
4.3 mysqldumpslow -s 更多参数
 
al   平均锁定时间ar   平均返回记录时间at   平均查询时间(默认)c    访问计数l    锁定时间r    返回记录t    查询时间

  • 得到返回记录集最多的10个SQL

     
    mysqldumpslow -sr -t 10 slow.log
    
  • 得到访问次数最多的10个SQL

     
    mysqldumpslow -sc -t 10 slow.log  
    
  • 得到按照时间排序的前10条里面含有左连接的查询语句

     
    mysqldumpslow-st-t 10 -g "left join" slow.log
    

5 SQL语句性能分析

5.1 explain执行计划
  • 用法: explain select语句
  • 例如:

1explain select * from user; 执行完毕之后,它的输出有以下字段:

id、 select_type、 table、 partitions、 type、 possible_keys、 key、 key_len、 ref、 rows、 Extra

要想知道explain命名怎么使用,就必须把这些字段搞清楚

5.2 explain返回结果分析
  • id

select识别符 ,代表语句的执行顺序,-般在select嵌套 查询时会不 同

id列数字越大越先执行,如果说数字一样大,那么就从上往下依次 执行

id列为null的就表是这是一个结果集,不需要使用它来进行查询。

  • select_ type

simple:表示不需要union操作或者不包含子查询的简单select查询。 有连接查询时,外层的查询为simple ,且只有一个

primary :一个需要union操作或者含有子查询的select ,位于最外 层的单位查询的select_type即为primary。且只有一个

union : union连接的两个select查询,第一个查询是dervied派生 表,除了第一个表外,第二个以后的表select_type都是union

dependent union :与union一样,出现在union或union all语句 中,但是这个查询要受到外部查询的影响

union result :包含union的结果集,在union和union all语句中,因 为它不需要参与查询,所以id字段为null

subquery :除了from字句中包含的子查询外,其他地方出现的子 查询都可能是subquery

dependent subquery :与dependent union类似,表示这个 subquery的查询要受到外部表查询的影响

derived : from字句中出现的子查询,也叫做派生表,其他数据库 中可能叫做内联视图或嵌套select

  • table

显示的查询表名

如果查询使用了别名,那么这里显示的是别名

如果不涉及对数据表的操作,那么这显示为null

如果显示为尖括号括起来的< derived N>就表示这个是临时表

依次从好到差: system , const,eq_ref , ref , fulltext , ref_or_null, unique_subquery , index_subquery , range , index_merge , index , ALL

除了all之外,其他的type都可以使用到索引,除了index_ merge之 外,其他的type只可以用到一个索引

  • type (从好到坏)重点代表了SQL的好与坏

system :表中只有一行数据或者是空表,职能用于myisam和 memory表。如果是Innodb引擎表, type列在这个情况通常都是 all或者index

const :使用唯一索引或者主键,返回记录-定是1行记录的等值 where条件时,通常type是const。其他数据库也叫做唯一索引扫描

eq_ref :出现在要连接过个表的查询计划中,驱动表只返回一-行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null ,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref

ref :不像eq_ref那样要求连接顺序,也没有主键和唯一索引 的要求只要使用相等条件检索时就可能出现,常见与辅助索引|的等值查找。或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。

fulltext :全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索弓|同时存在时,mysq|不管代价,优先选择使用全文索引。

ref_or_null :与ref方法类似,只是增加了null值的比较。实际用的不多。

unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值。

index_ subquery:用于in形式子查询使用到了辅助索引|或者in常数列表,子查询可能返回重复值,可以使用索弓|将子查询去重。

range :索弓|范围扫描,常见于使用>,<,is null,between ,in ,like等运算符的查询中。

index_ merge :表示查询使用了两个以上的索引,最后取交集或者并集,常见and,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range

index :索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引|排序或者分组的查询。

all :这个就是全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。

  • possible_ keys

查询可能使用到的索引|都会在这里列出来

  • key

查询真正使用到的索引,select__type为index__merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个。

  • key_len

用于处理查询的索引长度,如果是单列索引,那就整个索引长度算进去,如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去

  • ref

如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func

  • rows

这里是执行计划中估算的扫描行数,不是精确值

  • Extra常见返回

distinct :在select部分使用了distinc关键字

no tables used :不带from字句的查询或者From dual查询

using filesort :排序时无法使用到索引时,就会出现这个。常见于 order by和group by语句中

using index :查询时不需要回表查询,直接通过索弓|就可以获取查 询的数据。

using intersect :表示使用and的各个索引的条件时,该信息表示 是从处理结果获取交集

using union :表示使用or连接各个使用索引的条件时,该信息表 示从处理结果获取并集

using where :表示存储引擎返回的记录并不是所有的都满足查询 条件,需要在server层进行过滤

6 MYSQL索引介绍

6.1类型
  • 主键索引

    它是一种特殊的唯一索引 ,不允许有空值

    一般是在建表的时候同时创建 主键索引

  • 全文索引

    fulltext是一种只适用于MyISAM表的一个索引类型

    被索引列的数据类型只能是以下三种的组合char、varchar、text

    MySQL是通过match)和against()这两个函数来实现它的全文索引查询的功能。

  • 唯一索引 索引列的值必须唯一, 但允许有空值

  • 组合索引

    也叫多列索引,就是在多列上同时创建索引,使得多列的组合值唯一,创建组合索引|的好处是比分别创建多个单列索弓引|的查 询速度要快很多。

    组合索弓|创建遵循“最左前缀”规则

    如三列: id、name、age创建组合索引,则相当于分别创建了id、 name、 age , id、 name , id这三个索引

  • 普通索引

    最基本的索引,它没有任何限制

7 MYSQL索引创建规范

  • 索引是一把双刃剑,它可以提高查询效率但也会降低插入和更新的速度并占用磁盘空间
  • 在插入与更新数据时,要重写索引文件
  • 单张表中索弓|数量不超过5个
  • 单个索引|中的字段数不超过5个
  • 不使用更新频繁地列作为主键
  • 合理创建组合索引(避免冗余)
  • 不在低基数列上建立索引,例如'性别'
  • 不在索弓|列进行数学运算和函数运算,会使索引失效
  • 不使用%前导的查询,如like"%xxx" 无法使用索引
  • 不使用反向查询,如not in / not like ,无法使用索引,导致全表扫描
  • 选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中占用的空间很少,处理起来更快
  • 在经常需要排序(order by),分组(group by)和的distinct列上加索引(单独order by用不了索引,索引考虑加where或加limit)
  • 在表与表的而连接条件.上加,上索引,可以加快连接查询的速度
  • 使用短索引l,如果你的一一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度,比如前10个字符(前提是多数值是唯一的)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.

8 mysql存储引擎

8.1 MyISAM
  • 优点

    读的性能比InnoDB高很多

    索引与数据分开,使用了压缩,从而提高了内存使用率.

  • 缺点

    不支持事务

    写入数据时,直接锁表

8.2 InnoDB
  • 优点

    支持事务

    支持外键

    支持行级锁

  • 缺点

    不支持fulltext索引 (全文索引)

    行级所并不绝对,当不确定扫描范围时,锁全表

    索引与数据是紧密捆绑的,没有使用压缩导致体积庞大

9 mysql数据库的实时监控

9.1orzdba shell脚本

orzdba是淘宝DBA团队开发出来的一个perl监控脚本,主要功能是监控mysql数据库,也有一些磁盘和cpu的监控选项,好不好用就见仁见智,毕竟各公司需求不尽相同.

下载:网上找一下,脚本内容即可

  • 启动

./orzdba

  • 使用
 
Info  :Created By zhuxu@taobao.com
Usage :
Command line options :-h,--help           打印帮助信息.-i,--interval       时间(秒)间隔.-C,--count          次数时间.-t,--time           打印当前时间.-nocolor            打印无颜色.-l,--load           打印加载信息.-c,--cpu            打印Cpu信息.-s,--swap           打印交换信息.-d,--disk           打印磁盘信息.-n,--net            打印网络信息.-P,--port            用于mysql连接的端口号(默认3306).-p,--passwd         用于mysql连接的用户密码(默认为null)-S,--socket        套接字用于mysql连接的套接字文件。-com                打印MySQL状态 Status(Com_select,Com_insert,Com_update,Com_delete).-hit                Print Innodb Hit%.命中率-innodb_rows        Print Innodb Rows 行 Status(Innodb_rows_inserted/updated/deleted/read).-innodb_pages       Print Innodb Buffer Pool Pages Status(Innodb_buffer_pool_pages_data/free/dirty/flushed)缓冲池页面状态-innodb_data        Print Innodb Data Status(Innodb_data_reads/writes/read/written)-innodb_log         Print Innodb Log  Status(Innodb_os_log_fsyncs/written)-innodb_status      Print Innodb Status from Command: 'Show Engine Innodb Status'(history list/ log unflushed/uncheckpointed bytes/ read views/ queries inside/queued)-T,--threads        Print Threads Status(Threads_running,Threads_connected,Threads_created,Threads_cached).-rt                 Print MySQL DB RT(us).-B,--bytes          Print Bytes received from/send to MySQL(Bytes_received,Bytes_sent).-mysql              Print MySQLInfo (include -t,-com,-hit,-T,-B).-innodb             Print InnodbInfo(include -t,-innodb_pages,-innodb_data,-innodb_log,-innodb_status)-sys                Print SysInfo   (include -t,-l,-c,-s).-lazy               Print Info      (include -t,-l,-c,-s,-com,-hit).-L,--logfile        Print to Logfile.-logfile_by_day     One day a logfile,the suffix of logfile is 'yyyy-mm-dd';and is valid with -L.
Sample 案例:shell> nohup ./orzdba -lazy -d sda -C 5 -i 2 -L /tmp/orzdba.log  > /dev/null 2>&1 &

10 mysql集群监控工具介绍

  • 天兔LEPUS工具

    • 为所有数据库管理者、互联网企业数据库 监控而设计
    • 无需部署Agent,轻松监控1000+数据库实例,完善灵活的告警配置,详细的性能分析指标
  • 搭建及教程

官方文档:www.dbarun.com/docs/lepus/

11 开发性能测试脚本及执行

11.1用例准备
  • 使用sq|模拟用户使用场景
11.2JMeter开发mysq|性能测试
  • 步骤

1.DBC Connection Configuration配置mysq|配置

2.DBC Request写sq|脚本

3.打开性能监控工具进行查询

  • 其他 监控部署好、SQL架构是否合理、异常类测试(主从延迟、主从宕机)

  下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

​​编辑资料获取方式 :xiaobei_upup,添加时备注“csdn alex”

我是小北,专注软件测试和测试开发高薪就业和跳槽,有很多就业方案可以分享给你。

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

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

相关文章

鸿蒙NEXT实战开发: 依据前端对http请求进行二次简单封装

一、为什么要对http请求进行封装&#xff1f; 在我看来二次封装有一下几点好处 代码封装之后&#xff0c;开发人员只用关注业务层面的东西&#xff0c;不用去过多浪费时间在接口请求数据处理上。封装之后代码更加简洁&#xff0c;通俗易懂&#xff0c;方便后期维护&#xff0…

微服务中的相关概念

Eureka Eureka 是由 Netflix 开发的一个服务发现和注册中心&#xff0c;广泛应用于微服务架构中。Eureka 主要用于管理和协调分布式服务的注册和发现&#xff0c;确保各个服务之间能够方便地找到并通信。它是 Netflix OSS&#xff08;Netflix Open Source Software&#xff09…

OpenAI突然宣布停止向中国提供API服务!

标题 &#x1f31f; OpenAI突然宣布停止向中国提供API服务! &#x1f31f;摘要 &#x1f4dc;引言 &#x1f4e2;正文 &#x1f4dd;1. OpenAI API的重要性2. 停止服务的原因分析3. 对中国市场的影响4. 应对措施代码案例 &#x1f4c2;常见问题解答&#xff08;QA&#xff09;❓…

OpenAI禁止国区使用:免费国产大模型等你体验!

OpenAI中国停服 国产大模型免费使用 前言 OpenAI不支持中国区域访问 从6月25日开始&#xff0c;OpenAI 宣布了对中国停止提供 API 服务&#xff0c;毫无疑问的说这给国内的开发者带来了很大的不便&#xff0c;之后他们怎么去使用GPT 这类先进大模型方面遇到了难题。不过近期我们…

【ARMv8/ARMv9 硬件加速系列 3.4 -- SVE 复制指令CPY 使用介绍】

文章目录 SVE 复制指令CPYSVE 指令格式SVE 使用语法SVE CPY 使用示例SVE CPY 小结SVE 复制指令CPY CPY <Zd>.<T>, <Pg>/M, #<imm>{, <shift>}cpy 指令在 ARMv9 的

让我们聊聊网络安全中会涉及到的IP地址(IP协议)、MAC地址、路由、DNS协议(域名系统)、NAT技术(协议)、以太网帧、ARP协议

网络安全中会涉及到的IP地址&#xff08;IP协议&#xff09;、MAC地址、路由、DNS协议&#xff08;域名系统&#xff09;、NAT技术&#xff08;协议&#xff09;、以太网帧、ARP协议 一.IP地址&#xff08;IP协议&#xff09;1.IP地址&#xff08;IP协议&#xff09;的作用2.IP…

C语言·动态内存管理

1. 为什么要有动态内存管理&#xff1f; 例1&#xff1a; //固定的向内存申请4个字节 int a 10;//申请连续的一块空间 int arr[10]; 这些数据一旦声明定义之后就会在内存中有一块空间&#xff0c;这些空间都是固定的&#xff0c;为了让内存使用更加灵活&#xff0c;这时我们…

Python火焰锋动力学和浅水表面波浪偏微分方程

&#x1f3af;要点 &#x1f3af;流图可视化正弦余弦矢量场 | &#x1f3af;解空间变化边界条件二维拉普拉斯方程 | &#x1f3af;解圆柱坐标系标量场 | &#x1f3af;解一维泊松方程 | &#x1f3af;解二维扩散方程 | &#x1f3af;解火焰锋的动力学偏微分方程 | &#x1f3a…

[C#]winform基于opencvsharp实现黑白图像上色

【算法简介】 技术有时会提高艺术&#xff0c;但有时也会破坏艺术。着色黑白电影是一个可以追溯到1902年的古老想法。几十年来&#xff0c;许多电影创作者反对将黑白电影着色的想法&#xff0c;并将其视为对艺术的破坏。但今天它被接受为艺术形式的增强。该技术本身已经从艰苦…

2024年最新机动车签字授权人考试题库。

31."简易瞬态工况法"所使用的五气分析仪的温度范图:分析系统及相关部件应在&#xff08; &#xff09;。 A.0-40℃ B.0-50℃ C.0-60℃ D.-10-40℃ 答案:A 32.稀释氧传感器环境空气量程检测时的读数值位于&#xff08; &#xff09;%vol范围之外时&#xff0c;应…

[word] Word如何删除所有的空行? #职场发展#学习方法

Word如何删除所有的空行&#xff1f; 很多网友从网页复制文字粘贴到word文档后发现段落之间有空行&#xff0c;如果文字不多&#xff0c;手动删除这些空行也没有多少工作量&#xff0c;但是如果文字的字数达到成千上万&#xff0c;一个个手动删除这些空行还是很繁琐的。那么&a…

【Docker】Consul 和API

目录 一、Consul 1. 拉取镜像 2. 启动第一个consul服务&#xff1a;consul1 3. 查看consul service1 的ip地址 4. 启动第二个consul服务&#xff1a;consul2&#xff0c; 并加入consul1&#xff08;使用join命令&#xff09; 5. 启动第三个consul服务&#xff1a;consul3&…

解决ubuntu18.04 安装vscode 报依赖库错误,以及打不开终端的问题。

其实很简单&#xff0c;ubuntu18.04太老了&#xff0c;官网最新版本的vscode对ubuntu18.04会有些依赖库的问题。 一顿查资料后发现2023.11月的1.85版本正常使用&#xff0c;于是完美解决。 下载链接 Visual Studio Code November 2023 点击这里下载。 下载完成&#xff0c;…

iptables配置NAT实现端口转发

加载防火墙的内核模块 modprobe ip_tables modprobe ip_nat_ftp modprobe ip_conntrack 1.开启路由转发功能 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf sysctl -p2、将本地的端口转发到本机端口 将本机的 7777 端口转发到 6666 端口。 iptables -t nat -A PR…

MATLAB算法实战应用案例精讲-【数模应用】线性判别分析(附MATLAB、python和R语言代码实现)

目录 前言 算法原理 什么是判别分析 线性判别分析(LDA) 数学模型 二分类 多分类LDA ​编辑 算法思想: 费歇(FISHER)判别思想 贝叶斯(BAYES)判别思想 LDA算法流程 LDA与PCA对比 SPSSPRO 1、作用 2、输入输出描述 3、案例示例 4、案例数据 5、案例操作 …

java编写的界面可以调用python吗

如何使用Java调用Python程序 本文为大家介绍如何java调用python方法&#xff0c;供大家参考。 实际工程项目中可能会用到Java和python两种语言结合进行&#xff0c;这样就会涉及到一个问题&#xff0c;就是怎么用Java程序来调用已经写好的python脚本呢&#xff0c;一共有三种…

【ai】tx2 nx: trition client安装nvidia-pyindex 一直失败

系统版本的pip和python虚拟环境的pipyolov4-triton-tensorrt的master分支 官方client jetson:pip3 install --user nvidia-pyindex 不成功啊 这个是让nvidia-pyindex 拉取nvidia@tx2-nx:~$ pip3 install --user nvidia-pyindex Collecting nvidia-pyindexDownloading https://…

Elasticsearch:倒数排序融合 - Reciprocal rank fusion - 8.14

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。语法可能会在正式发布之前发生变化。Elastic 将努力修复任何问题&#xff0c;但技术预览中的功能不受官方正式发布功能的支持 SLA 约束。 倒数排序融合 (reciprocal rank fusion - RRF) 是一…

APP软件系统的开发流程

APP软件系统的开发是一个复杂的过程&#xff0c;需要多方面的知识和技能。建议选择专业的开发团队进行开发&#xff0c;以确保APP的质量和成功。APP软件系统的开发流程通常包括以下几个阶段。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

Vue-条件渲染,事件绑定指令

条件渲染指令 条件渲染指令有两种&#xff1a; 两种指令大致相似 v-ifv-show 如果v-if的值为true&#xff0c;那么显示出内容&#xff0c;v-show也是一样 如果v-if的值为false&#xff0c;那么将不创建这个指令的标签&#xff0c;v-show将隐藏此标签 <body><div id&q…