性能测试(五)—— 数据库性能测试-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”

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

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

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

相关文章

Ruby on Rails Post项目设置网站初始界面

在构建了Ruby的Web服务器后&#xff0c;第三步就可以去掉框架的官方页面&#xff0c;设置自己的网页初始页了。 Linux系统安装Ruby语言-CSDN博客 、在Ubuntu中创建Ruby on Rails项目并搭建数据库-CSDN博客、 Ruby语言建立Web服务器-CSDN博客 了解Ruby onRails项目中的主要文件…

PostgreSQL源码分析——口令认证

认证机制 对于数据库系统来说&#xff0c;其作为服务端&#xff0c;接受来自客户端的请求。对此&#xff0c;必须有对客户端的认证机制&#xff0c;只有通过身份认证的客户端才可以访问数据库资源&#xff0c;防止非法用户连接数据库。PostgreSQL支持认证方法有很多&#xff1…

OCC介绍及框架分析

1.OCC介绍 Open CASCADE &#xff08;简称OCC&#xff09;是一开源的几何造型引擎&#xff0c;OCCT库是由Open CASCADE公司开发和市场运作的。它是为开源社区比较成熟的基于BREP结构的建模引擎&#xff0c;能够满足二维三维实体造型和曲面造型&#xff0c;国内研究和使用它的单…

JetBrains IDEA 新旧UI切换

JetBrains IDE 新旧UI切换 IntelliJ IDEA 的老 UI 以其经典的布局和稳定的性能&#xff0c;成为了许多开发者的首选。而新 UI 则在此基础上进行了全面的改进&#xff0c;带来了更加现代化、响应式和高效的用户体验。无论是新用户还是老用户&#xff0c;都可以通过了解和适应这…

SolidWorks上海官方代理商亿达四方:赋能智能制造,创设计新高度

在上海这片充满活力的热土上&#xff0c;亿达四方作为SolidWorks的正版授权代理商&#xff0c;正以其专业的技术力量和周到的服务体系&#xff0c;为当地制造业的转型升级注入强大动力。我们专注于提供原装正版的SolidWorks系列软件&#xff0c;以及全方位的技术支持与解决方案…

redis-基础篇(2)

黑马redis-基础篇笔记 3. redis的java客户端-Jedis 在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/docs/clients/ 标记为❤的就是推荐使用的java客户端&#xff0c;包括&#xff1a; Jedis和Lettuce&#xff1a;这两个主要是提供了Redi…

好用的linux一键换源脚本

最近发现一个好用的linux一键换源脚本&#xff0c;记录一下 官方链接 大陆使用 bash <(curl -sSL https://linuxmirrors.cn/main.sh)# github地址 bash <(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/ChangeMirrors.sh) # gitee地址 …

C++第二学期期末考试选择题题库(qlu题库,自用)

又到了期末周&#xff0c;突击一下c吧— 第一次实验 1、已知学生记录的定义为&#xff1a; struct student { int no; char name[20]; char sex; struct 注意年月日都是结构体&#xff0c;不是student里面的 { int year; int month; …

Bureau of Contacts延迟高、卡顿、无法联机怎么办?

Bureau of Contacts是一款最多支持四个人联机玩的恐怖游戏&#xff0c;由MIROWIN开发并发行&#xff0c;6月20日在steam推出抢先体验版&#xff0c;相信喜欢恐怖游戏的玩家已经等不及了。玩家会扮演一名特工&#xff0c;接触并调查超自然现象&#xff0c;游戏分为调查和驱魔两个…

深入理解和实现Windows进程间通信(消息队列)

常见的进程间通信方法 常见的进程间通信方法有&#xff1a; 管道&#xff08;Pipe&#xff09;消息队列共享内存信号量套接字 下面&#xff0c;我们将详细介绍消息队列的原理以及具体实现。 什么是消息队列&#xff1f; Windows操作系统使用消息机制来促进应用程序与操作系…

大模型什么时候应该进行微调

经常会遇到一个问题——LinkedIn 上的人们问我如何微调 LLaMA 等开源模型&#xff0c;试图找出销售 LLM 托管和部署解决方案的业务案例的公司&#xff0c;以及试图利用人工智能和大模型应用于他们的产品。但当我问他们为什么不想使用像 ChatGPT 这样的闭源模型时&#xff0c;他…

示例:WPF中如何绑定ContextMenu和Menu

一、目的&#xff1a;开发过程中&#xff0c;有些模块的右键ContextMenu菜单是需要动态显示的&#xff0c;既是根据不同条件显示不同的菜单&#xff0c;很多是通过代码去生成ContextMenu的MenuItem&#xff0c;本文介绍通过绑定的方式去加载ContextMenu&#xff0c;Menu菜单栏的…

工厂ESOP系统促进工厂快速响应和工艺改进

在当今追求可持续发展和创新的时代&#xff0c;新能源产业正以惊人的速度崛起。新能源工厂作为这一领域的核心生产环节&#xff0c;面临着不断提高效率、优化工艺和快速应用新技术的巨大挑战。为了应对这些挑战&#xff0c;越来越多的新能源工厂开始引入 ESOP 系统&#xff08;…

数据结构与算法3---栈与队

一、栈 1、顺序栈 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> //开辟空间#define MAXSIZE 50//顺序栈的基本算法 typedef struct {int stack[MAXSIZE];int top; }SqStack;//初始化 void InitStack(SqStack* S) {S->top …

OCC异常处理机制理解

1.目的 异常处理提供了一种将控制权从正在执行的程序中的给定点转移到与先前执行的另一点关联的异常处理程序的方法。在各种错误条件下引发异常&#xff0c;该异常会中断其正常执行并将控制权传递给捕获此异常的处理程序&#xff0c;以保护软件质量。OCC作为开源的几何算法库&…

LabVIEW程序退出后线程仍在运行问题

LabVIEW程序退出后&#xff0c;线程仍在运行的问题可能源于资源管理不当、未正确终止循环、事件结构未处理、并发编程错误以及外部库调用未结束等方面。本文将从这些角度详细分析&#xff0c;探讨可能的原因和解决方案&#xff0c;并提供预防措施&#xff0c;帮助开发者避免类似…

昇思25天学习打卡营第2天|张量Tensor

一、张量的定义&#xff1a; 张量是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似。张量&#xff08;Tensor&#xff09;是MindSpore网络运算中的基本数据结构&#xff08;也是所有深度学习模型的基础数据结构&#xff09;&#xff0c;下面将主要介绍张量和稀疏张量的属…

重学java 79.JDK新特性 ⑤ JDK8之后的新特性

别怕失败&#xff0c;大不了重头再来 —— 24.6.20 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法 公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么IDK1.9要允许接口定义私有方法呢? 因为我们说接口是规范&#xff0c;规范是…

NetSuite Inventory Transfer Export Saved Search

用户之前有提出一个实际的需求&#xff0c;大致意思是想要导出Inventory Transfer的相关明细行信息&#xff0c;且要包含From Location&#xff0c;To Location&#xff0c;Quantity等信息。 我们知道From Location和To Location在IT Form中应该是在Main的部分&#xff0c;在D…

办公技能——如何写好会议纪要,提升职业素养

一、什么是会议纪要 会议纪要是一种记载、反映会议情况和议定事项的纪实性公文&#xff0c;是贯彻落实会议精神、指导工作、解决问题、交流经验的重要工具。 会议纪要可以多向行文&#xff1a;向上级机关汇报会议情况&#xff0c;以便得到上级机关对工作的指导&#xff1b;向同…