要知道,我们在测试性能的时候,其实就是在检测一个系统的限度,查看是什么原因影响了系统的性能。可以说,在一个系统当中,是有许多的因素会影响的,因为一个系统包含了太多的内容。接下来我们就来了解一下数据库在测试性能的时候要注意什么?

PerformanceRunner(性能测试工具)

一、硬件
硬件就指的是数据库服务器的配置,服务器说白了就是一台电脑而已,如果电脑的配置高,cpu处理能力强,内存大,硬盘是ssd的,那肯定性能好。当然这种方式成本也是最高的,要花钱的嘛。
二、系统配置
系统配置一个指的是操作系统的配置,有一些操作系统的配置会影响mysql的性能,现在咱们大多数服务器都是用的linux服务器,linux上面一切东西都是基于文件的,mysql数据里面的表、数据等等都是文件存在磁盘上的。
linux系统有一个系统配置是文件打开的数量,默认是1024,也就是最多只能打开1024个文件,那在数据库里面表比较多、并发大的情况下,这1024就不够用了,要想获取数据就得打开文件,但是打开文件的数量最多就1024个,就会导致有一些数据获取不到,就得等待别的文件关闭之后,才能打开。
还有一些mysql配置参数会影响mysql的性能。
1、sleep超时时间
mysql的连接数是提前配置好的,如果程序里面代码写的不好,有一些数据库操作没有及时关闭数据库,那这个链接就不会释放,会一直占用链接,这样子并发大的情况下,就会导致数据库连接数不够用了,就连接不上数据库了。mysql默认8小时不操作数据库才会自动关闭链接,所以这个sleep的超时时间会影响mysql的性能
2、独立表空间设置
表空间是什么呢,就是每个表存放数据的地方。
举个例子,一个仓库,你要往仓库里面放东西的话,你来一些东西你就随便扔到里面,这样东西一多,你要找到一个东西就很难找了。那怎么办呢,我在仓库里面放几个货架,每个货架放同一个种类的东西,这样的话,找一个东西就很方便了。
表空间呢就和这个货架差不多,每个表我单独管理的话,那找数据就比较方便了。
mysql5.6.6之前默认是共享的表空间,mysql5.6.6之后默认是开启了独立表空间的。
那什么是共享表空间呢?
就是说这个空间是所有的表都共享的,所有的表的数据都存在一个地方的。
你想一下,所有的货架都存在一个仓库里面的话,快递员去拿货的时候,人一多,可能进出都要排队,拿货的时候就比较慢了。
所以说共享表空间如果在数据量和并发量比较大的情况下,对IO的消耗是比较大的,影响性能。
共享表空间还有一个缺点就是不能自动收缩,自动收缩是什么意思呢,刚建表的时候,表里面数据很少,就1条数据,可能占用空间就几kb,到后来数据多了,占用了10个G的空间,然后发现有一些数据都是垃圾数据,删了5个G,那这个时候表空间就不会自动减小了,它还是10个G,浪费空间。
而独立表空间就是每个表的表空间都是独享的,用仓库这个例子就是每个货架都单独在一个房间里头,这样的话快递员去拿哪个东西,直接去那个房间里就好了,不用都挤在一个仓库里了。
而使用了独立的表空间,每个表都有自己的表空间,删了数据也会自动收缩,就不会有上面的问题了。
3、读/写进程数配置
在mysql5.5之后读、写的进程数是可以配置的。默认读和写的进程数都是4个。
进程多就是干活的人多,具体配置根据cpu的核数和业务逻辑来配置这两个值。
假如cpu是32核的,那么就是同时可以有32个进程在运行,就可以把这两个值给调大。
4、缓存配置
在说缓存配置之前咱们先了解清楚,计算机在处理任务的时候是怎么处理的,先从磁盘上读取数据,然后放到内存里面,cpu去内存里面拿数据,然后处理。
在写的时候正好相反,cpu处理完之后,把数据放到内存里面,内存再放到磁盘里。如果数据直接从内存里面拿的话,那速度就快很多了,我们看下面的图,读1M的数据,内存里面比从磁盘上快多少。
那到mysql里面,如果取数据的时候,mysql先把一些数据缓存到内存里面的话,取数据直接从内存里面取不就快很多了。
咱们在说mysql缓存之前,先说下mysql在执行一条查询语句的时候都做了什么。
5、qcache配置
缓存完整的SELECT语句和查询结果,当查询命中缓存,MySQL会立刻返回结果,跳过解析、优化和执行阶段。
查询缓存会跟踪系统中的每张表,如果这些表发生变化,那么和这张表相关的所有查询缓存全部失效。
在检查查询缓存的时候,MySQL不会对SQL进行任何处理,它精确的使用客户端传来的查询(select),只要字符大小写,或者注释有一点点不同,查询缓存就认为是不同的查询。
任何一个包含不确定的函数(比如now(),current_date())的查询不会被缓存。
MySQL查询缓存可以改善性能,但是在使用的时候也有一些问题需要注意:
开启查询缓存对于读写都增加了额外的开销。对于读,在查询开始前需要先检查缓存;对于写,在写入后需要更新缓存。
一般情况这些开销相对较小,所以查询缓存一般还是有好处的。但也要根据业务特征权衡是否需要开启查询缓存。
怎么配置呢,找到mysql的配置文件,在[mysqld]节点下加入下面参数的即可
innodb_buffer_pool配置
mysql里面还有一个缓存配置就是innodb_buffer_pool的配置,innodb是现在mysql的默认存储引擎,存储引擎说白了就mysql存数据的时候到底是怎么存的。bufferpool是innodb存储引擎带的一个缓存池,查询数据的时候,它首先会从内存中查询,如果内存中存在的话,直接返回,从而提高查询响应时间。
innodbbufferpool和qcache的区别是:qcacche缓存的是sql语句对应的结果集,bufferpool中缓存的是表中的数据。bufferpool一般设置为服务器物理内存的70%。
三、mysql架构上的优化
读写分离
多点写入
数据库表结构优化
当然系统在设计表结构的时候,一般都是架构师和一帮开发已经把表结构设计好了,咱们没达到那个级别架构上的东西咱也不懂,就在设计表结构的时候需要注意的一些东西。
1、使用可以存下你的数据的最小数据类型
2、使用简单的数据类型,int类型和varchar类型上,mysql处理int类型更简单
3、尽可能的使用notnull定义字段,可以为空的字段加上默认值
因为如果不限制notnull的话,字段值是可以为空的,默认为空就是null,如果是notnull的话字段值写空的话,就要写'',一个空的字符串。
null它在mysql里面也是要占用空间的,也不能利用索引,而空的字符串在mysql是不占用空间的,也可以利用索引。
4、时间类型的,用UNIX_TIMESTAMP,因为是int类型的
四、mysql索引
索引是什么呢,就和字典的目录一样。有目录了,那咱们查数据就快了。最适合建索引的列是出现在where子句后面的列。
唯一索引的效果最好,因为是唯一的。利用最左前缀。索引并不是越多越好。
mysql索引有4种类型
1、普通索引
最普通的索引,所有列都可以加
createindexindex_nameontable_name(col);
2、主键索引
建表的时候加的主键
3、组合索引
createindexindex_nameontable_name(col,col2);
4、唯一索引
CREATEUNIQUEINDEXindex_name
ONtable_name(column_name);
本篇内容到这里就要结束了,大家现在对于数据库性能测试的主要测试点应该有所了解了吧。最后,小编再和大家推荐一个好的性能测试工具,PerformanceRunner通过模拟海量用户并发测试整个系统的承受能力,实现压力测试、性能测试等。大限度地缩短测试时间,并且支持监控服务器硬件系统运行情况,检测硬件设备对软件测试结果的影响,以便更好地检测软件性能。