数据库性能优化思路

说到数据库的查询效率优化问题,首先就能想到以下几种方式:

这里是说基于数据库的优化,还有其它的优化方式;比如,增加缓存,把频繁使用的数据放到redis中,这样可以加快速度;但同样会带来数据的一致性问题。

所以,这里只讨论数据库层面的优化。

1. sql语句优化,索引优化,慢查询

2. 数据表结构优化

3. 读写分离

4. 分库分表

面试或工作过程中,问到数据库提升性能的思路,无法以上几种。

第一, sql优化,最简单直接的就是不要使用select *等语句,一是可能导致索引等失效;二是会导致查询到大量不需要到数据,导致系统响应缓慢。

其次,就是在适当的字段上面建立索引,这样可以大大提升数据库的查询效率;还有就是慢查询。

所谓的慢查询就是sql语句查询时间超过某个点的查询语句,比如超过了两秒钟。

而怎么解决慢查询问题,首先就是可以使用一些第三方的监控系统,监控某个接口响应时间是否异常等;或者通过配置mysql数据库的方式,开启其慢查询的功能;这样超过一定时间限制的sql语句就会被记录下来,这时再根据具体的业务需求,对sql进行优化;比如关联查询拆分成单表查询,然后在业务代码中对数据进行组合处理等。

还有就是使用mysql提供的explain字段,来查看sql语句的执行过程,是否有命中索引等,以此来对sql语句或索引进行优化。

第二,表结构优化。在表结构的设计过程中,根据不同的业务场景,对数据表结构进行设计,没有关系的字段不要放到同一张表中;有关系的字段可以进行适当的业务关联或者表结构冗余。

比如,订单表和用户表,如果完全遵循数据库的三范式,那么订单表中就不应该保存用户的任何信息,只需要把订单表和用户表进行关联就行了;比如在订单表中保存用户的id信息,或者再使用一张表去关联订单与用户的信息。但如果在与订单相关联的业务中经常需要使用到用户的手机号。

这时就可以在订单表中添加一个用户手机号的字段,这样就不用每次需要使用手机号时,都要关联用户表,增加查询的复杂度。

第三,读写分离。读写分离是一种常见的数据库优化方法,其主要原理就是采用数据的主从模式;在主表中写入数据,从从表中读取数据;这样防止读写都在一个数据库里,增加数据库的压力。

但读写分离会带来一个问题就是主从复制是需要时间的,不论是使用mysql自带的主从复制功能,还是使用比如canal这种中间件;所以可能会存在短时间内的数据不一致问题。

第四,分库分表。分库分表在大型互联网公司中算是一种基本操作,比如腾讯,阿里,抖音等用户量都接近十亿级,每天日活量上亿;所以,这种情况下的单库就无法支撑如此庞大的数据访问,所以就需要分库分表。

分库分表分为垂直拆分与水平拆分;所谓的垂直拆分,就是把一张数据表的字段拆分到多张表中;比如,有些公司一张表可能有几十个,甚至上百个字段;这样就会导致数据库单张表的压力太大。

而所谓的水平拆分就是一张表中的数据太多,比如抖音有十几亿用户,如果把这些用户信息放到一张表中,那么没有任何数据库产品能够做到。所以,就需要把这些数据拆分到多张数据表中。比如,抖音可以把不同省份的人放到不同的数据表中,这样就可以大大减轻表数据的压力。

而在根据是否把拆分的表放到同一个数据库中,还是放到不同的数据库中,又分为同库垂直分表,同库水平分表;以及异库分表——也就是分库分表。

在数据库系统的优化过程中,如果是在单库中,那么只需要使用前两种的优化方式即可;而如果涉及到读写分离,和分库分表;那么就涉及到多个数据库的数据一致性问题;数据同步问题,事务问题等。以及不同库等匹配规则;比如读写分离有多个库时,怎么确保读取数据平均分布在不同的数据库上,其具体策略是什么,应该怎么实现。

在比如,读写分离时,怎么根据不同的业务场景,合理的把数据拆分到不同的数据库中;拆分完成之后,怎么保证数据请求能够请求到正确的数据库中;数据一致性怎么保证,分布式事务怎么处理,数据异常时的回滚怎么做。

当然,市面上已经提供了具体的实现产品,比如sharding-jdbc以及mycat等;但由此产生的数据一致性问题以及分布式事务问题,还需要自己解决。

其次,自从微服务的出现,分布式思想深入人心;但事实上,分布式也可以理解成一种垂直方向上的分表,不同的业务模块拆分成不同的服务,每个服务有自己独立的数据库。

而且,这四种优化方式,并不是完全独立的, 而是可以进行叠加的。

比如,分库分表时,垂直拆分和表结构的优化可以作为一个东西来看待;但同样,分库分表时,在不同的数据库表中,索引怎么建,水平拆分时怎么建索引,垂直拆分时又该怎么建索引?

在垂直拆分时,如果一条数据需要多张表中的字段,也就是跨表查询语句该怎么写,索引该怎么建?水平拆分时,如果查询记录涉及到跨表该怎么办?

比如说,一张订单表中有二十个字段,一共有一亿条数据;这时需要把这张表进行分库分表;也就是说,订单表中的二十个字段要垂直拆分到两张表中,一亿条数据拆分到五张表中,每张表两千万数据,数据根据id进行拆分,1到2千万在第一张表中,2千万零1到4千万在第二张表中,以此推类。

这时,一个业务场景中,需要查询到字段中涉及到拆分的两张表中的字段,然后查询的订单数据中需要分页查询,并且分页的是一千九百九九万九千九百九十到两千万零十,这样跨表查询的索引应该怎么建,分页查询应该怎么实现?

这都是需要考虑的问题。

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

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

相关文章

IP地址的主要功能及其在网络中的重要性

在当今数字化时代,互联网已经成为人们生活和工作中不可或缺的一部分。而IP地址(Internet Protocol Address)作为互联网中的关键组成部分,发挥着至关重要的作用。本文将探讨IP地址的主要功能以及其在网络中的重要性。 IP地址查询&…

计算机视觉数据集——扑克识别数据集

扑克数据集 数据集地址:https://download.csdn.net/download/matt45m/89130302 这是一个检测扑克牌种类的数据集,检测种类目前只有6种,分别是 "queen", "ten", "nine", "king", "jack"…

短视频转gif怎么做?三十秒在线转换gif

在现在这个快节奏的时代,gif动画相较于长时间的视频更受大众的欢迎。当我们需要将短视频、电影等视频制作成gif动画图片的时候就可以使用gif动画图片(https://www.gif.cn/)制作网站-GIF中文网,无需下载软件,手机、pc均…

Spring面试题pro版-6

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。 Spring中的单…

数据仓库—ETL最佳实践:提升数据集成的效率与质量

ETL(Extract, Transform, Load)作为数据仓库和数据集成的核心环节,对于确保数据的准确性、一致性和可用性至关重要。在实践中,遵循一些经过验证的最佳实践可以帮助企业提高ETL项目的成功率,优化数据处理流程&#xff0…

Redis GEO实现附近的人功能

附近的人功能是社交应用中非常常见的一项功能,它允许用户查找并发现他们周围的其他用户。使用Redis的GEO特性来实现这一功能是非常高效和简单的。以下是实现这一功能的基本步骤: 1. 准备工作 确保你的Redis服务器版本支持GEO特性(3.2.0及以…

fs.writeFile写入文件后 通过路径获取文件 获取不到最新写入的文件

通过fs.writeFile 直接通过路径获取文件 发现一直是首次上传的图片 不是当前最新上传的图片 const fs uni.getFileSystemManager()fs.writeFile({ilePath: ${uni.env.USER_DATA_PATH}/avatar.png,data: imageData.replace(/^data:image\/\w;base64,/,),encoding: base64,succe…

The Great Equalizer

# The Great Equalizer ## 题面翻译 Tema 购买了一台老旧设备,设备上有一个小屏幕和一个磨损的铭文“伟大的平衡器”。 卖家说,这台设备需要提供一个整数数组 $a$ 作为输入,之后“伟大的平衡器”将按照以下方式工作: 1. 将当前数组…

OSCP靶场--Fail

OSCP靶场–Fail 考点(rsync未授权覆盖公钥Fail2ban提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.153.126 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-12 23:34 EDT Warning: 192.168.153.126 giving …

招生管理|基于SprinBoot+vue的招生管理系统系统设计与实现(源码+数据库+文档)

招生管理目录 基于SprinBootvue的招生管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 前台 后台 教师权限 学生权限: 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&#xff…

大数据------JavaWeb------JDBC(完整知识点汇总)

JDBC 定义 全称为Java数据库连接(Java DataBase Connectivity):是使用java语句来操作所有关系型数据库的一套API JDBC本质 它是官方定义的一套操作所有关系型数据库的规则(即接口),各个数据库厂商会去实现…

Java 9 新特性

Java 9 新特性 Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接下来我们会详细介绍 Java 9 的新特性。 Java 9 新特性 模块系统:模块是一个包的容器,Java 9 最大的变化之一是引…

VLC-Qt实现简单的视频播放器

VLC-Qt是一个结合了Qt应用程序和libVLC的免费开源库。它提供了用于媒体播放的核心类,以及用于快速开发媒体播放器的GUI类。由于集成了整个libVLC,VLC-Qt具备了libVLC的所有特性, 例如:libVLC实例和播放器、单个文件和列表播放、音…

.NET i18n 多语言支持与国际化

环境 WIN10 VS2022 .NET8 1.👋创建项目 2.👀创建Resources Controllers HomeController.en.resx HomeController.fr.resx HomeController.zh.resx 3.🌱Program.cs添加国际化支持 // 添加国际化支持 builder.Services.AddLocalization(…

6.Hexo标签插件和资产文件夹

标签插件 标签插件,基本上是只是一些小的代码片段,可以将他们添加到markdown文件中 以便添加特定的代码,不需要编写复杂或混乱的HTML 当很多时候想要在markdown页面添加一些特殊元素,通常必须使用HTML 如果不想这么用HTML&#…

CSS特效---百分比加载特效

1、演示 2、一切尽在代码中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title&…

公众号文章如何添加多个附件?

在公众号分享一些文档给粉丝下载&#xff0c;有那么几种方式。比如把文档转成超链接&#xff0c;放在公众号的“阅读原文”处&#xff0c;或者把文件转成二维码&#xff0c;贴在公众号文章里面。这两种方式其实都需要先把文件转成超链接&#xff08;网页链接&#xff09;&#…

开发需求15-使用el-checkbox组件实现el-tree组件的父子关联关系(非全选/全不选)

需求描述: 大家都知道el-tree可以很明显的通过选中来体现上下节点的父子选中状态,那么如果要求把后端把el-tree的数据结构,通过一个展开的list返回给你,使用el-checkbox组件渲染每一个节点,同时要求选中某一个节点,同时可以选中其父节点和子节点;取消也是一样。 思路:…

【目标检测数据集】VOC2007 数据集介绍

一、介绍 VOC 数据是 PASCAL VOC Challenge 用到的数据集&#xff0c;官网&#xff1a;http://host.robots.ox.ac.uk/pascal/VOC/ 备注&#xff1a;VOC数据集常用的均值为&#xff1a;mean_RGB(122.67891434, 116.66876762, 104.00698793) Pytorch 上通用的数据集的归一化指…

OVITO-2.9版本

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩&#xff01; 主要专栏内容包括&#xff1a; †《LAMMPS小技巧》&#xff1a; ‾ \textbf…