数据库调优-原理分析和jmeter案例分享

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情


1.写在前面

作为一个后端开发程序员,少不了和数据库打交道!!!

毕竟大部分的业务需求,无非就是查数据,然后在前端展示,例如:table表格展示,echarts图表展示等。

echarts图表,一般来说,大部分都是些统计业务,那就涉及到统计的sql语句了。

统计的sql语句,很多时候,查询的效率就尤其的重要了。毕竟你等几十秒,才能展示出来。

估计客户,提着40米大刀在赶来的路上!!!

image.png

一个资深的数据库工程师,就尤为重要了。但是大部分小型开发公司,一般不具备这样的人才。

很多时候,这些数据库的优化,都得自己干了。

干成了,升职加薪迎娶白富美走上人生巅峰!!!

1658913795875.jpg

别闹,醒醒!

废话不多说了,今天我们就来谈谈数据库调优的一些思路,将会从下面几个方向展开描述!!!

  • 调优原理和JMeter案例分享
  • 连接池优化
  • SQL语句优化
  • 数据库优化

那我们今天先来谈谈调优原理和JMeter案例分享

开干!!!

image.png

2. 数据库调优原理

思考这样一个问题:

# 请问这两条SQL语句有什么区别呢?你来猜一猜那条SQL语句执行查询效果更好!

select id from sys_goods where goods_name='华为 HUAWEI 麦芒7 魅海蓝 6G+64G 全网通';

select id from sys_goods where goods_id=1496732598527979521;

系统瓶颈图:

image-20220727135538160.png

灵魂三问:

1.1 为什么要进行MySQL数据库调优?

  • 提升网站整体通吐量,优化用户体验数据库是关键之一

    • 流畅页面的访问速度

    • 良好的网站功能体验

    • 避免网站页面出现访问错误

      • 由于数据库连接timeout产生页面5xx错误
      • 由于慢查询造成页面无法加载
      • 由于阻塞造成数据无法提交
  • 增加数据库的稳定性

    • 很多数据库问题都是由于低效的查询引起的

总结:不要让数据库成为系统的瓶颈!数据库的TPS,1w以上轻轻松松!

1.2 什么影响数据库性能?

  • 服务器:OS,CPU,Memory,network【大错特错!】

  • MySQL本身

    • 数据库表结构【对性能影响巨大】
    • SQL语句,低效率的
    • 超大的表
    • 大事务
    • 数据库配置
    • 数据库整体架构
    • ....

1.3 数据库调优到底调什么?

  1. 优化SQL语句:根据需求编写结构良好的SQL语句【一个需求实现的SQL是很多】

  2. 数据库表结构:建立索引,冗余字段,分表....

  3. MySQL数据库的配置:配置最大连接数,加缓存,加链接等待超时时间...

    • 加缓存:排序缓存,查询缓存,join缓存....
  4. OS操作系统底层优化:tcp连接数,打开文件的数量,线程栈...

  5. 服务器硬件优化:多核CPU,更大内存,SSD【固态硬盘】

2. JMeter数据库压力测试案例

2.1 驱动下载

在测试计划中我们要及时的添加JDBC驱动链接。这里我用的mysql数据库是5.7版本,那么我相对应的JDBC驱动选择了5.x版本。

这里,我们直接使用项目中maven仓库中对应的依赖即可,例如:

image.png

这里以8.0.25为例。

2.2 测试过程

压力测试数据库执行的SQL的TPS,0.72k+

1) 配置数据库驱动

jmeter下载地址:官网地址

image-20220727140450089.png

下载,直接解压即可使用。这里以5.2.1版本为例。

image-20220727140605848.png

image-20220727141030451.png

2) 配置线程组

image-20220727141231521.png

3) 配置JDBC 连接池

添加JDBC Connection Configuration(JDBC连接池也有人叫连接组)

image-20220727141355811.png

需要设置jdbc线程池名称,这个变量在JDBC Request中要使用的;还有要设置Database URL,格式为:

jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC&characterEncoding=utf-8

注意:

  • ?后面的serverTimezone=UTC&characterEncoding=utf-8不能缺少,否则会报时区错误。
  • 在配置的时候,jmeter如果报1045-Access denied for user 'root'@'localhost'(using password: YES)这类错误,请重置访问用户的密码,以及给与该用户权限。

image-20220727141713346.png

注意:

  • 一个测试计划,每个线程组中,可以配置多个连接池。不同连接池使用名称唯一标识符区分。

4) 添加JDBC 请求

右键点击“线程组[Mysql]”,再添加一个采样器:JDBC request,在jmeter中request可以编辑select和insert等不同的采样器类别。即通过不同的类别添加配置我们需要的对mysql不同的操作。比如

image-20220727143249619.png

image-20220727143651650.png

  • prepared select statement 带参数拼接查询
  • select statement 查询

5) 添加结果监听器

image-20220727144058873.png

  • 聚合报告
  • 查看结果树
  • 活动线程数Active Threads Over Time
  • 每秒事务数TPS
  • 平均响应时间RT
  • 服务端:内存、网络、CPU、磁盘io、网络io【单位mb】

6) 查看测试结果

image-20220727174548938.png

image.png

测试结论:连接数为 1 ,数据库7.2k+的TPS


好了,以上就是我个人的实操了。

个人理解,可能也不够全面,班门弄斧了。

好了,今天就先到这里了!!!^_^

后面的分享,就留在下次了,掰掰。

如果觉得有收获的,帮忙点赞、评论、收藏一下呗!!!

image.png

猜你喜欢

转载自juejin.im/post/7125034745389383687
今日推荐