软件测试项目性能调优的方法
### 重点:项目性能调优的方法
1、通讯
2、应用集群部署
3、缓存
4、资源动静分离
5、数据库集群(OraceRac)
6、SOA服务优化
1.1首先是一下通讯,通讯层面需要采取异步线程通讯模式,比如socket异步线程通讯模式,此模式有负责接收消息的线程,有负责处理消息的线程,流水线模式分工协作。常使用的Tomcat6.0版本以后对8080端口的通讯监听就是采用的socket异步模式。
1.2说到通讯还需要提一下另外一种使用场景,在通讯层面采用队列(比如activemq)或者缓存(redis)。例如处理秒杀场景,并发量大,先将所有请求接收放入队列或者缓存,然后从队列或者缓存中获取部分请求处理,处理完一部分再获取一部分处理,直到秒杀结束(即库存不足)。如果秒杀结束,队列中还有消息未处理,那么将这些消息全部返回客户端,返回商品已售完。
2应用的集群部署,我们项目是采用ngnix做反向代理,将用户请求分发到集群环境中的不同服务器,降低了单个服务器的压力,起到负载均衡的作用,同时,它带来了很多其他好处,比如:增加系统的并发处理能力,可以处理更多的用户请求;防止出现因某台服务器宕机而导致业务中断的单点故障,因为某台服务器出现故障时,ngnix反向代理会做到自动隔离该服务器,不再将请求转发到宕机的服务器;可做到热部署,在上线过程中选择部分服务器重启,保证业务不间断运行。
3 缓存,我们项目采用redis做缓存服务器,将查询多修改少的数据放入缓存(比如:产品列表啊),页面显示产品列表时直接从缓存中获取,无需通过数据查询,减少IO操作,大大提高的查询的速度,同时也减轻了对数据库的压力。
4 资源动静分离,项目里面如果存在大量的图片等静态资源,需要将这些静态资源单独部署到缓存服务器,然后通过远程连接地址(比如:http://192.168.2.1:8080/picture/dog.jpg)访问,可提高页面加载速度,同时减轻应用服务器的压力。
5 数据库集群部署,可防止数据库访问应用的单点故障,减轻数据库访问压力,我们公司dba工程师会将oracle部署为集群模式,用到两台服务器安装数据库,两台服务器的数据库数据存储在同一块共享磁盘。
6、**SOA(Service Oriented Architecture)“面向服务的架构”:**他是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。一个服务 通常以独立的形式存在与操作系统进程中。各个服务之间 通过网络调用。通俗来说为项目架构的优化。
#### **SQL***语句优化**
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
3、最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库,备注、描述、评论之类的可以设置NULL,其他的,最好不要使用NULL。
不要以为NULL不需要空间,比如:char(100)型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段,null不占用空间。可以在num上设置默认值0,确保表中num列没有null值
4.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
5.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
6.in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了,很多时候用 exists 代替 in 是一个好的选择:
7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描,除非建立函数索引。
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.Update 语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志。
12.对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。
13.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
14.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
15.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
16.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
17.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。