数据库监控与调优【一】—— 数据库调优的维度

news2024/9/24 3:19:15

数据库调优的维度

左边是千金良方的,右边是个人优化的

在这里插入图片描述

业务需求

  • 不合理的需求,可能会造成很多问题
  • 勇敢地对不合理的需求说不
  • 拨乱反正,把不合理的需求变成合理的需求

例子

财务SaaS系统,财务领域有种叫做代账的概念,通俗的说就是账务外包,本公司不招聘财务,让外包公司记账。这个外包公司也叫代账公司,这个系统就是给代账会计使用。一个代账会计会给n个企业记n个账。代账会计登录系统后会展示代账会计管理的所有的账。

产品经理需求:该代账会计管理列表必须要有每条账的各种汇总信息,比如:同比增长、环比增长等。而且需要精确展示。导致需要n张表关联查询然后实时计算结果。同时该列表还不允许分页

具体页面如下:

在这里插入图片描述

针对这样的需求,初期使用java代码实现,结果对于管理帐非常多的会计需要8s左右才能返回。太慢了。后续对mysql的存储过程作了改进,优化到了5s左右

为啥存储过程能够提速

首先存储过程只需要在创建时编译即可,而sql每次执行都需要被数据库编译。其次存储过程可以降低网络开销。像上面的业务,sql非常复杂。可能有100-200行,如果使用java代码需要将sql发送到数据库。而存储过程本身就是存储在服务器端的,调用时只需要使用CALL语句传入参数即可。因此会节省网络。但是即使这样也需要5s左右时间才能返回。依然很慢

后续做了一下sql调优,主要增加了一些索引和改写了部分sql,提高执行效率,但是也只能优化到2s左右

但是业务认为2s依然是不可以接受的

此时,其实业务上这样的需求,技术上是难保证业务功能的基础项还可以高效返回数据的。这就是业务需求的不合理性

优化方案:第一,每条账的各种汇总信息如同比增长、环比增长等不在列表页显示,改为详情中显示。列表页sql得到了大幅优化,性能得到了大幅提升。用户想要查看某条账的各种汇总信息如同比增长、环比增长等,就变成了单个账户的查询也是可控的。第二,作分页,对于某些代账会计管理的账目非常多,一次全部返回的网络开销是非常大的,作分页后每页只展示20条,可以降低网络开销。第三,提供了统计模式,如果用户确实想要在列表页查看各套账目的汇总信息,那么可以点击统计模式,统计模式会出现弹窗,提示用户这个模式是比较慢的,然后调用以前的老代码展示之前的页面视图,满足业务的需求

结果:本来的页面只需要500ms就能返回,性能提升可想而知

优化后的页面如下:

在这里插入图片描述

系统架构

做架构设计的时候,应充分考虑业务的实际情况,考虑好数据库的各种选择

  • 根据项目读的压力,考虑需不需要做读写分离
  • 根据项目可用性需求,考虑需不需要为数据库实现高可用
  • 根据项目并发量,创建合理个数的数据库实例,实例太多会造成资源浪费;实例太少又满足不了业务需求
  • 根据项目数据量,合理分库分表
  • 用什么数据库,一些业务场景可能更适合非关系型数据库或者缓存数据库等

SQL及索引(开发人员最需要关注)

根据需求编写良好的SQL,并去创建足够高效的索引

表结构

设计良好的表结构,直接关系SQL的编写

数据库参数设置(DBA会比较关注)

设置合理的数据库性能参数

如:

  • join buffer:处理联表查询
  • sort buffer:处理排序

系统配置(运维和DBA会比较关注)

操作系统提供了各种资源使用策略,设置合理的配置,以便于数据库充分利用资源

如:

  • linux系统提供了swap交换区->提供了swappiness参数用来控制什么情况下使用swap
  • swappiness=0,操作系统会在几乎没有内存的情况下使用swap
  • swappiness=100,操作系统剩下的内存将会很快被交换
  • 对于数据库应该把swappiness设置的尽可能小,从而保证热点数据保留到物理内存。

ps:物理内存(Physical memory)是相对于虚拟内存而言的。物理内存指通过物理内存条而获得的内存空间,而虚拟内存则是指将硬盘的一块区域划分来作为内存。内存主要作用是在计算机运行时为操作系统和各种程序提供临时储存

swappinessLinux内核参数,控制换出运行时内存的相对权重。swappiness参数值可设置范围在0到100之间。 低参数值会让内核尽量少用交换,更高参数值会使内核更多的去使用交换空间。默认值为60(参考网络资料:当剩余物理内存低于40%(40=100-60)时,开始使用交换空间)。对于大多数操作系统,设置为100可能会影响整体性能,而设置为更低值(甚至为0)则可能减少响应延迟。

swappiness参数值说明

仅在内存不足的情况下–当剩余空闲内存低于vm.min_free_kbytes limit时,使用交换空间。

vm.swappiness = 0

内核版本3.5及以上、Red Hat内核版本2.6.32-303及以上,进行最少量的交换,而不禁用交换。

vm.swappiness = 1

当系统存在足够内存时,推荐设置为该值以提高性能。

vm.swappiness = 10

默认值

vm.swappiness = 60

内核将积极的使用交换空间。

vm.swappiness = 100

对于内核版本为3.5及以上,Red Hat内核版本2.6.32-303及以上,多数情况下,设置为1可能比较好,0则适用于理想的情况下(it is likely better to use 1 for cases where 0 used to be optimal)

硬件

选用什么配置的机器?

  • 硬盘、内存、CPU、网卡…都会对数据库性能有所影响

总结

数据库调优时,可以从这7个维度出发,并且尽量在金字塔的底部做优化。从而获得更好的投入产出比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp+vue3+vite+ts+uviewPlus搭建项目

创建项目架构 首先使用官方提供的脚手架创建一个项目,这里我创建的 vue3 vite ts 的项目: npx degit dcloudio/uni-preset-vue#vite-ts project-name(如命令行创建失败,请直接访问 giteehttps://gitee.com/dcloud/uni-preset-vu…

2023-06-20 x-ui-服务器配置记录

基础软件: yum update -y yum install -y curl yum install -y socat 工作软件: bash <(curl -Ls https://raw.githubusercontent.com/sprov065/x-ui/master/install.sh) 设置: 参考: 使用云服务器搭建代理-腾讯云开发者社区-腾讯云

9 HAL库驱动框架简述

目录 HAL库驱动框架简述 HAL库外设设计思想 HAL库和Cube MX相结合 一、对外设的封装——句柄结构体 二、外设初始化 初始化结构体 初始化的逻辑 三、外设使用逻辑 通用接口函数 初始化函数 I/O操作函数 控制函数 状态参数 扩展接口函数 总结 补充&#xff1a;H…

算法拾遗三十四线段树

算法拾遗三十四线段树 线段树说明物理结构使用线段树落方块的问题 线段树说明 给定固定长度的数组&#xff0c;然后要在数组给定的范围内完成加法【如数组1&#xff0c;200下标元素加6】&#xff0c;更新【7&#xff0c;375范围数组元素更新为4】&#xff0c;查询操作【查询3到…

【云原生丶Docker】Docker镜像加速器:给冰山提提速!

Docker镜像加速器是一种用于加速Docker镜像下载和构建的工具。它可以提高Docker镜像的下载速度&#xff0c;从而加快应用程序的开发和部署速度。 Docker镜像加速器通常使用CDN(内容分发网络)技术来实现加速。CDN是一种分布式网络架构&#xff0c;可以将内容缓存在全球各地的服务…

命令行--git--多次commit如何合并成一个commit

参考:https://blog.csdn.net/qq_50652600/article/details/120800309 在我们平时开发中&#xff0c;我们提交代码免不了要和git打交道&#xff0c;那么我们肯定是先从预发分支上&#xff08;公司一般都用pre命名&#xff0c;这里为了方便演示用master&#xff09;上拉去最新的代…

测试工程师首用chatGPT,编写python读取xmind测试用例chatgtp+python+xmind

背景 有用xmind写测试用例的吧&#xff0c;统计一个xmind的条&#xff0c;需要花大量的时间&#xff0c;还有要统计有多少条冒烟的&#xff0c;多少条不通过的&#xff0c;还有通过的条数。 需求 快速使用python&#xff0c;写一个简单的脚本&#xff0c;统计所有xmind节点&…

FPGA_学习_09_PWM呼吸灯

PWM在三相电机控制中&#xff0c;有着非常重要的地位。 如果你需要用FPGA去实现三相电机的控制&#xff0c; PWM这一关是绕不过的。好在PWM的基本原理是比较简单的。所以原理部分本文就略过&#xff0c;本文基于PWM实现呼吸灯。 1 时序 {signal: [{name: clk, wave: p....…

4 STM32启动过程(以Cortex-M3为例)(保姆级介绍)

设计知识点补充在前&#xff1a; 1.关于存储器映射、存储器重映射、内存映射、地址映射、地址转换等计算机专业名词详解 参考见 关于存储器映射、存储器重映射、内存映射、地址映射、地址转换等计算机专业名词详解_Vincent_Song的博客-CSDN博客 2.哈佛结构和冯诺依曼结构的区别…

vue2中左侧菜单和头部tab标签联动

效果图 我这里是使用的vue2 element-ui来实现的&#xff0c;代码可以直接拿来使用 一、首先先安装element-ui element-ui官网 npm i element-ui -S 然后在main.js里面配置&#xff0c;安装官网的步骤来就可以了&#xff0c;这里就不一一介绍了 import Vue from vue; impor…

用wget等命令行工具下载Jenkins上的文件

背景 现在一般公司的内部CI系统都用Jenkins实现&#xff0c;本地部署的时候我会将待测试文件下载到本地&#xff0c;再上传到Linux开发板&#xff0c;但能否从Linux开发板直接下载呢&#xff1f;只要Linux与Jenkins server之间的网络是联通的&#xff0c;那就可以 解决方法 …

【从零开始学习JAVA | 第二十三篇】集合体系结构

目录 前言&#xff1a; 单列集合&#xff1a; set与list的区别&#xff1a; 双列集合&#xff1a; map的特点&#xff1a; 总结&#xff1a; 前言&#xff1a; JAVA中为我们提供了很多集合&#xff0c;这些集合都有自己很独特的特点&#xff0c;因此我们要学习所有的…

网络安全合规-网络安全工程师发展前景(三)

上海网络安全工程师工资按工作经验统计&#xff0c;其中应届毕业生工资5250&#xff0c;0-2年工资8910&#xff0c;3-5年工资11330&#xff0c;8-10年工资13500&#xff0c;6-7年工资16170&#xff0c;该数据仅供参考。 北京网络安全工程师工资按工作经验统计&#xff0c;其中…

python selenium 定位鼠标悬浮后的新弹窗数据

背景 最近需要获取网页上的标签数据&#xff0c;但是标签大于3个以后是隐藏的&#xff0c;需要鼠标hover上去才显示。如下图&#xff0c;图一是刚进来界面展示的&#xff0c;需要知道额外的7个标签则需要将鼠标移动到目标上面去。 但是比较尴尬的一个点是&#xff0c;当游览器打…

数据结构C语言版本(中)

第四章 串 串&#xff1a;限定数据元素类型的线性表。 应用实例&#xff1a; 编辑软件(本质上是字符串处理) 信息检索、病毒查找(字符串比较) 第一节 逻辑结构 一、定义 串是由字符组成的线性表。 STRING(D&#xff0c;S&#xff0c;P) D {ai| ai∈CHARACTER(字符集), i0,1…

Verilog基础之八、多路选择器实现

一、前言 选择器在FPGA中是基础的组成部分&#xff0c;英文全称为Multiplexer&#xff0c;为一个多输入单输出的结构。以器件xc7k480tffv1156为例&#xff0c;在slice中&#xff0c;也可以看到F7AMUX&#xff0c;F8MUX&#xff0c;这两个MUX都是二输入单输出的选择器。 二、工程…

【雕爷学编程】Arduino动手做(128)---2路I2C电平转换模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

VR虚拟现实技术为机械专业教学带来新思路

随着虚拟现实技术的发展&#xff0c;VR已经成为机械专业教学的一种新方式。它可以为学生提供更加生动、直观的学习体验&#xff0c;同时也可以帮助教师更好地进行教学和评估。以下是广州华锐互动总结的一些常见的应用场景&#xff1a; 模拟实验和操作&#xff1a;VR可以为学生提…

(UE4/5) PS中生成LUT进行UE4/5的色域颜色校正

整理自官方&#xff1a;使用虚幻引擎查找表&#xff08;LUT&#xff09;进行颜色校正 | 虚幻引擎5.2文档 (unrealengine.com) 一、Unreal Engine中截图 在UE4/5中截一张场景图&#xff08;比较有代表性的&#xff09; 然后&#xff0c;用这张图片&#xff1a;&#xff08;不要…

Qt使用事件(event)与定时器实现字幕滚动

目录 1、效果展示2、实现思路3、滚动窗口部件3.1、成员变量3.2、事件重写3.3、成员方法3.3、方法实现 1、效果展示 我们经常能够在外面看到那种滚动字幕&#xff0c;那么就拿qt来做一个吧。 2、实现思路 实现一个窗口部件&#xff0c;这个窗口部件显示了一串文本标语,它会每…