Jmeter性能测试笔记 --mysql篇

mysql数据库
常用数据库架构
一主多从:读写分离,master主要写入,slave主要读取,从主数据库拷贝数据到分库,分担压力,但是会存在数据更新不及时
双机热备:一台服务器读写,主机挂掉立马启用备用机,备用机读写的数据无法自动更新到主机
主从同步工作原理:
master将改变记录到二进制日志(binary log)中
slave将master的binary log events拷贝到它的中继日志(relay log)
slave重做中继日志中的事件,将改变反映它自己的数据

数据库分库分表的测试方法
拆分原因
单表或单库数据量太大
硬件不能升级或者无法升级

分库分表方案
垂直拆分
水平拆分:通过算法定义表数据的归属,比如 userid%31,userid%32在哪张表

性能测试
QPS
queries per seconds 查询量/秒,一台服务器每秒能够相应的查询次数
show global status like ‘Question%’

TPS
Transactions Per Second 是事务数/秒,是一台数据库服务器在单位时间内处理的事务的个数。
tps= (Com_commit + Com_rollback)/seconds(运行的秒数)
show global status like ‘Com_commit’;
show global status like ‘Com_rollback’;

线程连接数
show global status like ‘Max_used_connections’; 使用最大值
show variables like ‘max_connections’; 设置最大值
show global status like ‘Threads%’;

Query Cache
查询缓存用于缓存select查询结果
当下次接收到相同查询请求时,不再执行查询直接返回结果,直接在缓存中找
适用于大量查询,很少涉及到数据修改

开启Query Cache:修改my.cnf,将query_cache_size设置为具体的大小,具体大小多少取决于查询的实际情况,但最好设置为1024的倍数,参考值32M;
	             增加一行:query_cache_type=0/1/2;
	              (如果设置为0,则是关闭)
		(如果设置为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 :值越大代表表锁造成的堵塞越严重。
行锁:当我知道要对哪几行数据进行修改的时候会把这几行数据锁住,一直等待自己操作完成。
Innodb_row_lock_waits innodb行锁,太大可能是间隙锁造成的。

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

MYSQL慢查询
定义:
执行速度超过定义的时间的查询;
不同的系统定义不同的慢查询指标;

 show variables  like '%slow_query_log%';	 查询慢查询状态

设置
 set global slow_query_log=1	开启慢查询,MySQL重启失效
 my.cnf 增加或修改参数永久生效
 slow_query_log = 1
 slow_query_log_file = /tmp/mysql_slow.log
 slow_query_log_file = /data/mysql/slow.log  慢查询日志路径
 long_query_time = 1  慢查询的时长
 log_queries_not_using_indexes = 1  未使用索引的查询也被记录到慢查询日志

慢查询日志分析
mysqldumpslow命令
-s 表示按照何种方式排序
c:访问计数
i:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
-t 返回前面多少条数据
-g 后面写正则匹配,大小写不敏感
举例
mysqldumpslow -s r -t 10 slow.log(绝对/相对路径):得到返回记录集最多的10个SQL
mysqldumpslow -s c -t 10 slow.log 得到访问次数最多的10个SQL
mysqldumpslow -s t -t 10 -g “left join” slow.log 得到按照时间排序的前10条里面含有左连接的查询语句

SQL语句性能分析
explain 执行计划
id:select识别符,代表语句的执行顺序,一般在select嵌套查询时会不同,id数字越大越先执行,如果一样大,就从上往下依次执行,如果等于null就代表是结果集。
select_type:
simple表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个;
primary表示一个需要union操作 或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个;
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类似,表示这个sybquery的查询要收到外部表查询的影响
derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select

table
	如果不涉及对数据表的操作,那么这显示为null
	如果显示为尖括号括起来的就表示这个是临时表

type
	依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL ;
		system:表中只有一行数据或者是空表,且只能用于myisam和memory表。如果是Innodb引擎表,type列在这个情况通常都是all或者index。
		const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描。
		eq_ref:出现在要连接多个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref。
		ref:不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可以出现,常见与辅助索引的等值查找。或多列主键,唯一索引中,使用第一个列之外的列作为等值查找也会出现。总之,返回数据不唯一				的等值查找就可能出现。
		fulltext:全文索引检索,它的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引。
		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蹭进行过滤返回符合要求的记录。
	除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引

possible_keys:查询可能使用到的索引都会在这里列出来
key:查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一次。
key_len:用故意处理查询的索引长度,如果是单列索引,那就整个索引长度算进去,如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去。
ref:如果是使用的常数等值查询,这里就会现实const,如果是连接查询,被驱动表的执行计划这里会现实驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func。
rows:执行计划重估算的扫描行数,不是精确值。

Extra常见返回:
	distinct:在select部分使用了distinct关键字
	no tables used:不带from字句的查询或者From dual查询
	using filesort:排序时无法使用到索引时,就会出现这个。常见于order by和group by语句中。
	using index:查询时不需要回表查询,直接通过索引就可以获取查询的数据。
	using intersect:表示使用and 的各个索引的条件时,该信息表示是从处理结果获取交集。
	using union:表示使用or连接各个使用索引的条件时,该信息表示从处理结果获取并集。
	using where:表示存储引擎返回的记录并不是所有的都满足查询条件,需要在server层进行过滤。

MySQL索引
主键索引
是一种特殊的唯一索引,不允许有空值。
一般是在建表的时候同时创建主键索引。
唯一索引
索引列的值必须唯一,但允许有空值。
普通索引
最基本的索引,无任何限制。
全文索引
fulltext是一种只适用于MyISAM表的一个索引类型。
被索引列的数据类型只能是以下三种的组合char,varchar,text
MySQL是通过match()和against()这两个函数来实现它的全文索引查询的功能。
组合索引
也叫多列索引,就算在多列上同时创建索引,使得多列的组合值唯一,创建组合索引的好处是比分别创建多个单列索引的查询熟读要快很多。
组合索引创建遵循“最左前缀”规则。

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

MySQL存储引擎
MyISAM
优点:
读的性能比InnoDB高很多。
索引与数据分开,使用率压缩,从而提高了内存使用率。
缺点:
不支持事务。
写入数据时,直接锁表。

接口性能测试的目标及范围
发现应用程序的性能瓶颈。
发现数据库的性能瓶颈。
应用程序各项性能指标。
数据库各项性能指标。

常见接口协议
HTTP 超文本传输协议
HTTPS 安全超文本传输协议
FTP 文件传输协议
TCP 网络控制协议
IP 互联网协议
UDP 用户数据协议

https协议
	默认端口:443
	安全性的ssl加密传输协议
	以安全为目标的http协议通道,可以理解为http协议的安全版
https协议栈中的位置
	HTTPS-->SSL/TLS-->TPC/IP-->数据链路层

ftp协议
	默认端口:21和20
	http和https都是面向网页的,而ftb是面向文件的
	ftp使用两个并行的tcp连接来进行文件传输
	ftp使用的两个并行tcp连接为控制连接和数据连接
	控制连接扶着两个主机之间传输控制信息,如用户表示,口令,发送的命令等,运行端口为21
	数据连接用于实际传输一个文件,运行端口为20(主动模式)

jmeter进行ftp协议接口测试
linux下FTP服务启动与关闭命令
查看FTP服务是否运行中:service vsftpd status
查看本地是否含有包含ftp的进程开启:ps -ef | grep ftp
FTP设置开机自动运行:chkconfig vsftpd on
关闭FTP开机自动运行:chkconfig vsftpd off
查看所有服务开启自动运行的情况:chkconfig --list
启动FTP服务:service vsftpd start
停止FTP服务:service vsftpd stop
重启FTP服务:service vsftpd restart

配置ftp服务器通过Jmeter 的ftp请求,对站点进行上传下载的操作。
	
性能测试要素:被测系统及版本;测试数据;测试场景(包含异常场景);预期结果;预期性能指标;
性能测试报告:被测系统;版本号;运行环境,配置;测试场景(并发定义);预期性能指标;实际结果;
性能测试结果:测试结论;测试人员;如不通过说明瓶颈;如果通过说明最大性能指标;容量规划(性能计划);

jmeter组件开发
扩展开发实现的两种方式
继承AbstractJavaSamplerClient抽象类
实现JavaSamplerClient接口

你可能感兴趣的:(Jmeter性能测试笔记 --mysql篇)