【MySQL进阶之路 | 高级篇】数据库调优

1. 调优的目标

  • 尽可能节省系统资源,以便系统可以提供更大负荷的服务。
  • 合理的结构设计和参数调整,以提高用户操作响应的速度。
  • 减少系统的瓶颈,提高MySQL数据库整体的性能。

2. 如何定位调优的问题

不过随着用户量的不断增加,以及应用程序复杂度的提升,我们很难用更快去定义数据库调优的目标,因为i用户在不同时间段访问服务器遇到的瓶颈不同,比如双十一促销的时候会带来大规模的并发访问;还有用户在进行不同的业务操作时,数据库的事务处理和sql查询都会有所不同。因此我们还需要更精细的定位,去确定调优的目标。

用户的反馈

用户是我们服务的对象,因此他们的反馈是最直接的。虽然他们不会直接提出技术建议,但有些问题往往是用户第一时间发现的。

日志分析

我们呢可以通过查询数据库日志和操作系统日志的方式找出异常情况,通过它们来定位遇到的问题。

服务器资源使用情况

通过监控服务器的CPU,内存,IO使用情况,可以实时了解服务器的性能的使用,与历史情况做对比。

其他

除了活动会话监控外,我们也可以对事务,锁等待等进行监控,这些都可以帮助我们对数据库的运行状态有更全面的认识。

3. 调优的维度和步骤

我们需要调优的对象是整个数据库管理系统,它不仅包括sql查询,还包括数据库的部署变量,架构等。

第一步:选择适合的DBMS

如果对事务性处理以及安全性要求高的话,可以选择商业的数据库产品。这些数据库在事务处理和查询性能上都比较强。比如Oracle。那么单表存储上亿条数据是没有问题的。如果数据表设计的好,即使不采用分库分表,查询效率也不差。

除此之外,还可以采用开源的MySQL进行存储,如果进行事务处理的话可以选择InnoDb,非事务处理可以选择MyISAM。

MySQL阵营包括键值型数据库,文档型数据库,搜索引擎,列式存储,图形数据库。这些数据库的优缺点和使用场景各有不同。

第二步:优化表设计

选择了DBMS之后,我们就需要进行表设计了。而数据表的设计方式直接影响了后续的sql查询语句。RDBMS中,每个对象都可以定义为一张表,表与表之间的关系代表了对象之间的关系。如果用的是MySQL,我们还可以根据不同表的使用需求,选择不同的存储引擎。除此之外,还有一些优化的原则可以参考:

  1. 表结构要尽量遵循三范式的原则。这样可以让数据结构更加清晰规则,减少冗余字段,同时也减少了在更新,插入和删除数据时等异常情况的发生。
  2. 如果查询应用比较多,尤其是需要进行多表联查的时候,可以采用反范式化进行优化。反范式采用空间换时间的方式,通过增加冗余字段提高查询的效率。
  3. 表字段的数据类型选择,关系到了查询效率的高低以及存储空间的大小。一般来说,如果字段可以采用数值类型就不要采用字符类型;字符长度要尽可能设计的短一些。

数据表的结构设计很基础,也很关键。好的表结构可以在业务发展和用户量增加的情况下依然发挥作用,不好的表结构的设计会让数据表非常臃肿,查询效率会很低。

第三步:优化逻辑查询

当我们建立好数据表之后,就可以对数据表进行增删改查的操作了。这时我们首先需要考虑的是逻辑查询优化。

sql查询优化,可以分为逻辑查询优化和物理查询优化。逻辑查询优化就是通过改变sql语句的内容让sql执行效率更高效,采用的方式是对sql语句进行等价变换,对查询进行重写。

sql的查询重写包括了子查询优化,等价谓词重写,视图重写,条件简化,连接消除和嵌套连接消除等。

比如我们在讲解EXISTS子查询和IN子查询的时候,会根据小表驱动大表的原则选择适合的子查询。在where子句中会尽量避免对字段进行函数运算,它们会让字段的索引失效。

第四步:优化物理查询

物理查询优化是在确定了逻辑查询优化之后,采用物理优化技术(比如索引等),通过计算代价模型对各种可能的访问路径进行估算,从而找到执行方式中代价最小的作为执行计划。在这个部分中,我们需要掌握的重点是对索引的创建和使用。

但索引不是万能的,我们需要根据实际情况来创建索引。

sql查询时需要对不同的数据表进行查询,因此在物理查询优化阶段也需要确定这些查询所采用的路径,具体的情况包括:

  • 单表扫描:对于单表扫描来说,我们可以全表扫描所有的数据,也可以局部扫描。
  • 两张表的连接:常见的连接方式包括了嵌套循环连接,hash连接和合成连接。
  • 多张表的连接:多张数据表进行连接时,顺序很重要。因为i不同的连接路径查询的效率不同,搜索空间也会不同。我们在进行多表连接的时候,搜索空间可能会达到很高的数据量级,巨大的搜索空间显然会占用更多的资源,因此我们需要通过调整连接顺序,将搜索空间调整为一个可接收的范围。
第五步:使用Redis或Memcached作为缓存

除了可以对sql本身进行优化以外,我们还可以请外援提升查询的效率。

因为数据都是存放在数据库中,我们需要从数据库层中取出数据放到内存中进行业务逻辑的操作,当用户量增大的时候,如果频繁地进行数据的查询,会消耗数据库的很多资源。如果我们将常见的数据直接放入内存,就会大幅提升查询的效率。

键值存储数据库可以帮助我们解决这个问题。

常用的键值存储数据库有Redis或Memcached,它们都可以将数据存放到内存中。

从可靠性来说,Redis支持持久化,可以让我们的数据保存在硬盘上,不过这样一来性能消耗 也会比较大。而Memcached仅仅是内存存储,不支持持久化。

通常我们对于查询响应要求高的场景(响应时间短,吞吐量大),可以考虑内存数据库,毕竟术业有专攻。传统的RDBMS都是将数据存储在硬盘上,而内存数据库则存放在内存中,查询起来要快的多。不过使用不同的工具,也增加了开发人员的使用成本。

第六步:库级优化

库级优化是站在数据库的维度上进行的优化策略,比如控制一个库中的数据表数量。另外,单一的数据表总会遇到各种限制,不如取长补短,利用外援的方式。通过主从架构优化我们的读写策略,通过对数据库进行垂直或水平切分,突破单一数据库或数据表的访问限制,提升查询的性能。

1. 读写分离

如果读和写的业务量很大,并且它们都在同一个数据库服务器中进行操作,那么数据库的性能就会出现瓶颈,这时为了提升系统的性能,优化用户体验,我们可以采用读写分离的方式降低主数据库的负载,比如用主数据库(master)完成操作,用从数据库(slave)来完成读操作。

2. 分库分表

对数据库分库分表。当数量级达到千万级以上时,有时候我们需要把一个数据库切成多份,放到不同的数据库服务器上,减少对单一数据库服务器的访问压力。如果你使用的是MySQL,就可以使用MySQL自带的分区表功能,当然你也可以考虑自己做垂直拆分(分库),水平拆分(分表),垂直+水平拆分(分库分表)。

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

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

相关文章

PCL Local Surface Patches 关键点提取

目录 一、算法原理1、算法原理2、 参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、算法原理 主曲率是某一点局部形状的体现,Local Surface Patches 关键点检测法…

深入理解计算机系统 CSAPP 家庭作业11.7

静态内容是指在不同请求中访问到的数据都相同的静态文件。例如:图片、视频、网站中的文件(html、css、js)、软件安装包、apk文件、压缩包文件等。 /** get_filetype - derive file type from file name*/ void get_filetype(char *filename,…

Pytorch使用教学3-特殊张量的创建与类型转化

1 特殊张量的创建 与numpy类似,PyTorch中的张量也有很多特殊创建的形式。 zeros:全0张量 # 形状为2行3列 torch.zeros([2, 3]) # tensor([[0., 0., 0.], # [0., 0., 0.]])ones:全1张量 # 形状为2行3列 torch.ones([2, 3]) # tensor([[1., 1., 1.], # …

「12月·长沙」第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)

随着科技的飞速发展,智能机器人在当今社会的重要性愈发凸显。从制造业的自动化生产线,到医疗领域的手术机器人,再到家庭生活中的智能助手,机器人与人工智能的融合正在改变着我们的生产和生活方式。第四届机器人、自动化与智能控制…

Docker(十)-Docker运行elasticsearch7.4.2容器实例以及分词器相关的配置

1.下载镜像 1.1存储和检索数据 docker pull elasticsearch:7.4.2 1.2可视化检索数据 docker pull kibana:7.4.22.创建elasticsearch实例 创建本地挂载数据卷配置目录 mkdir -p /software/elasticsearch/config 创建本地挂载数据卷数据目录 mkdir -p /software/elasticse…

后端面试题日常练-day05 【Java基础】

题目 希望这些选择题能够帮助您进行后端面试的准备,答案在文末 在Java中,以下哪个关键字用于表示方法重写(Override)? a) override b) overrule c) overwrite d) supercede Java中的HashMap和Hashtable有什么区别&am…

Spark SQL----Sampling Queries采样查询

Spark SQL----Sampling Queries采样查询 一、描述二、语法三、例子 一、描述 TABLESAMPLE语句用于对表进行采样。它支持以下采样方法: TABLESAMPLE(x行):将表格向下采样到给定的行数。TABLESAMPLE(x百分比&#xff0…

IEC104转MQTT网关支持将IEC104数据转换为华为云平台可识别的格式

随着智能电网和物联网技术的深度融合,传统电力系统中的IEC104协议设备正逐步向更加开放、智能的物联网体系转型。华为云作为全球领先的云计算和AI服务提供商,其物联网平台为IEC104设备的接入与数据处理提供了强大的支撑。本文将探讨IEC104转MQTT网关在MQ…

微信小程序-本地部署(前端)

遇到问题:因为是游客模式所以不能修改appID. 参考链接:微信开发者工具如何从游客模式切换为开发者模式?_微信开发者工具如何修改游客模式-CSDN博客 其余参考:Ego微商项目部署(小程序项目)(全网…

民用无人机用途

无人驾驶飞机简称“无人机”,是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机,或者由车载计算机完全地或间歇地自主地操作。无人机按应用领域,可分为军用与民用。军用方面,无人机分为侦察机和靶机。民用方面&#xff0…

GoFly快速开发框架基于Go语言和Vue3开发后台管理附件管理插件包

说明 为了给客户提供更好的交互体验,框架把附件管理独立打包成插件包,这样附件管理接可以做个不通需求的附件管理插件包来满足不同甲方客户需求。 目前附件插件包有2个:一个基础包、一个高级包 附件插件包功能 1.基础包 统一管理业务系统…

Avalonia中的数据模板

文章目录 1. 介绍和概述什么是数据模板:数据模板的用途:2. 定义数据模板在XAML中定义数据模板:在代码中定义数据模板:3. 使用数据模板在控件中使用数据模板:数据模板选择器:定义数据模板选择器:在XAML中使用数据模板选择器:4. 复杂数据模板使用嵌套数据模板:使用模板绑…

SpringBoot报错:mapping values are not allowed here

在启动项目之后,项目报错,显示 org.yaml.snakeyaml.scanner.ScannerException: mapping values are not allowed here ,如下: 这个问题在于yml文件的格式错误,那么检查yml文件的格式,检查空格,冒…

Autodesk Maya v2025 解锁版下载及安装教程 (三维动画建模渲染)

前言 Autodesk Maya 是一款用于三维动画、建模、仿真和渲染的软件。它是电影、电视、游戏和虚拟现实等领域中最流行的专业工具之一,被广泛用于制作复杂的特效和动画。功能完善,工作灵活,制作效率高,真实感强,是一款高…

[红明谷CTF 2021]write_shell 1

目录 代码审计check()$_GET["action"] ?? "" 解题 代码审计 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){// if(preg_match("/| |_||p…

如何恢复手机删除的照片?教你3招快速解决,不再错过美好回忆

在这个数字化的时代&#xff0c;我们的生活点滴往往通过照片来记录和珍藏。但是&#xff0c;有时候因为误操作或手机空间不足&#xff0c;我们心爱的照片可能会不翼而飞。别担心&#xff0c;即使照片从安卓手机中消失&#xff0c;也有办法将它们重新唤回。如何恢复手机删除的照…

喜报!钛铂数据 TapDB 通过中国信通院文档数据库产品测试

在中国信通院组织的2024上半年“可信数据库”—文档数据库基础能力测试中&#xff0c;深圳钛铂数据有限公司&#xff08;以下简称“钛铂数据”&#xff09;旗下的钛铂分布式文档数据库&#xff08;TapDB&#xff09;顺利通过了所有测试项目&#xff0c;测试结果表明&#xff0c…

B4005 [GESP202406 四级] 黑白方块 【暴力枚举】【前缀和】

#include<bits/stdc.h> using namespace std; int n,m,ans,tmp; char mp[20][20]; int cheak(int a,int b,int c,int d){//a<c b<dint cnt0;//枚举矩阵中的每个点 for(int ia;i<c;i)for(int jb;j<d;j)if(mp[i][j]1) cnt;//统计黑格的个数 return 2*cnt(c-a1…

数据库窗口函数实战

目录 前言 窗口函数语法 创建测试表和数据 使用示例 PARTITION BY 窗口函数 ROW_NUMBER RANK DENSE_RANK RANGE ROWS 前言 SQL 具有很高的灵活性&#xff0c;可以根据需求进行复杂的数据查询和分析&#xff0c;支持多表联合查询&#xff08;join&#xff09;、排序…

【b站-湖科大教书匠】5 运输层 - 计算机网络微课堂

课程地址&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 5 运输层 5.1 运输层概述 5.2 运输层端口号、复用与分用…