软件性能瓶颈问题之数据库性能问题定位

前言:数据库的性能瓶颈包括:数据库索引,锁,表空间,慢sql,数据量

一、性能问题

1.1 缺乏索引

索引本质上是一种数据结构,允许数据库快速查找特定的数据

1.2 查询效率低

使用通配符,例如select * from student  where student_name =“%乐乐%”’,在搜索词之前和之后使用“%”通配符会使此查询非常慢,尤其是在会话表很大的情况下。 数据库需要扫描会话表中的每一行,并针对每一行评估 LIKE 运算符,这可能非常耗时;转换为索引查询,如select * from student where student_ID= 200,如果给student_ID添加索引,查询比上一个快得多

最好避免在 SQL 查询中使用通配符(如“%”),因为它们可能会导致性能缓慢且效率低下。 相反,请尝试使用利用索引来提高查询性能的目标查询

1.3 数据类型不正确

不合适的数据类型导致性能不加和存储空间浪费,如:对应为整数的字段使用 varchar 数据类型可能会导致性能问题。

在设计数据字段的时候要了解数据用途和扩展,如果要设计一个字段来存储名称,则应考虑名称的长度以及它们是否可以包含特殊字符。 同样,如果要设计一个字段来存储电话号码,则应考虑是否将存储国际号码

1.4 连接数不够:

1、数据库配置不合理, 默认为100

命令修改: set golbal max_connections = 1024;
配置修改: /etc/my.cnf max_connections = 1024;
重启: service mysqld restart


2、慢查询导致IO阻塞, 连接长时间得不到释放

慢查询不是及时可以看到的, 一般当一个sql执行完才能判断是否为慢查询


3、代码缺陷sql执行完, 连接未释放

1.5、缓存命中率低

查询缓存是否开启: show variables likes “%query_cache%”;

开启缓存: set session query_cache_type = ON;

二、性能问题定位

1、explain分析

  1. 表的读取顺序
  2. 表的读取操作的操作类型
  3. 哪些索引可以使用
  4. 实际命中索引
  5. 表之间的引用
  6. 每张有多少行被检索

1、具体操作:在查询语句前加上explain,得到如下字段返回值

字段含义解读:

  1. id: 语句的执行顺序标识, 优先级越高, 越先执行
  2. select_type: 查询类型
    1. simple: 简单类型
    2. primary: 若包含任何复杂的子部分, 最外层查询被标记为primary
    3. union: 连表查询时, union之后的select, 则被标记为union第一个select为primary
  3. table:访问列表名称
  4. type:访问类型,有无使用索引

1、system: const的一个特例, 表中只有一条记录时发生
2、const: where条件被转换成常量, 只读取一次数据就能获取结果, 最多有一条记录匹配(主键, 唯一索引)
3、eq_ref: 走索引, 返回单行的数据.(连表查询时出现, 主键或唯一索引)
4、ref: 走索引, 返回的数据可以是多行, 通常使用等于时发生(普通索引)
5、range: 用了索引, 进行范围扫描, 常用于between, <, >, in等操作
6、index: 全索引扫描, 最简单的例子, select id from table
7、all: 全表扫描(重点关注)

        5、possible_keys:可以利用索引,无索引责显示null

        6、key:从possible_keys中所选择使用的索引

        7、rows:结果条数

        8、extra:查询方式

1. using index:只用索引, 可以避免访问表
2. using where:使用到where来过滤数据, 不是所有的where都要显示using where(访问了索引, 显示为using index)
3. nusing tmporary:用到临时表
4. nusing filesort:用到额外的排序

2、实例讲解

1、根据上面的字段含义解读,我们看到这个表中使用的是全面扫描,all的方式,全部扫描在数据量大时暂用较高的cpu和内存,从而降低软件在使用过程中数据查询的性能

3、jmeter测试数据库性能

1、在测试计划中添加mysql连接诶jar包。这个jar可以去官网下载

2、添加JDBC元件

相关参数说明

Vatible Name:按需命名,和jdbc中的变量命名保持一致即可

1、Validation Query:默认选择Select 1

2、Database URL:jdbc:mysql://IP:port/数据库名

3、JDBC Driver class:选择第一个mysql驱动

4、username:数据库登录名

5、password:数据库登录密码

3、添加数据库链接配置

相关参数说明

Vatible Name:按需命名,和jdbc中的变量命名保持一致即可

1、Validation Query:默认选择Select 1

2、Database URL:jdbc:mysql://IP:port/数据库名

3、JDBC Driver class:选择第一个mysql驱动

4、username:数据库登录名

5、password:数据库登录密码

4、按照线程和聚合报告中的数据进行分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值