数据库SQL优化技巧

作为程序员,主要的工作任务就是curd,和数据库打交道是无可避免的。掌握一些数据库的优化技巧是非常有必要的

一、减少数据访问

1、使用索引
  索引的原理是利用额外的空间建立了一个平衡的搜索树,大大缩短了查询的时间,使得查询的时间复杂度从O(n)降低到O(log(n)),但是在进行插入、修改、删除操作的时候,同时要对搜索树进行相对应的维护,需要带来额外的开销

在这里插入图片描述
例如上面的搜索树,需要查询6的时候,步骤如下
(1)6和10比较,10大,那么往左边下去,到4
(2)6和4比较,6大,那么往右边下去,到6
(3)6和6比较,相等,那么6就是想要查询的数据

如果没有索引,那么每个元素都要比较一下才可以查出目标数据,这点可以比喻二分查找元素的案例

上面的搜索树只是一个类比,mysql的索引使用的是b+树,思想和上面的例子是差不多的,只不过b+树是多叉平衡树,并且数据存在叶子节点,这样可以方便查找相邻的元素

使用索引需要注意的是,只有当索引符合一定条件的时候索引才会生效,因为索引并不能解决100%的问题,例如两个字段id、name,id列建立了一个索引,假如判断条件为where id = name,每一行的name是会变化的,那么就无法使用索引,必须每一行都进行判断才可以得到结果,并不是数据库设计者故意不让索引生效的,而是索引本身不能解决这个问题

查询条件不能使用索引原因
INDEX_COLUMN <> ?不等于操作不能使用索引
INDEX_COLUMN not in (?,?,…,?)不等于操作不能使用索引
function(INDEX_COLUMN) = ?经过普通运算或函数运算后的索引字段不能使用索引
INDEX_COLUMN || ‘a’ = ?经过普通运算或函数运算后的索引字段不能使用索引
INDEX_COLUMN like ‘%’||?含前导模糊查询的Like语法不能使用索引
INDEX_COLUMN like ‘%’||?||‘%’含前导模糊查询的Like语法不能使用索引
INDEX_COLUMN is nullB-TREE索引里不保存字段为NULL值记录,因此IS NULL不能使用索引
CHAR_INDEX_COLUMN=12345Oracle在做数值比较时需要将两边的数据转换成同一种数据类型,如果两边数据类型不同时会对字段值隐式转换,相当于加了一层函数处理,所以不能使用索引。
a.INDEX_COLUMN=a.COLUMN_1给索引查询的值应是已知数据,不能是未知字段值。

在使用联合索引还有个最左匹配原则,例如有联合索引a、b、c,a没生效,那么b和c就无法生效,反过来,c如果要生效,那么a、b必须生效

2、分库分表
分库分表又有垂直划分和水平划分两种,先看一下定义:
(1)垂直分库
一般是为了解耦,将一个整体划分为多个部分,同时这样做也可以平衡数据库的压力,每个数据库管理一部分数据
在这里插入图片描述
(2)水平分库
一般用于解决单个数据库压力过大的问题,例如一百万个人同时访问学生数据库,会导致数据库瘫痪,那么可以考虑水平分库,下面举一个例子进行理解

例如下面将学生数据库分为了3个,那么可以根据学生的id去分配学生数据,例如常见的mod法,假如id为10,10%3=0,那么这个学生的数据库存在第一个数据库中,反过来看,数据库1存放学生id为0,3、6、9…的学生数据,数据2存放的是1、4、7、10…的学生数据,数据3存放的是2、5、8、11…的学生数据
在这里插入图片描述
(3)垂直分表

把存储数据多的或者不常用的字段分离出来,可以提高查询的速度,因为在查找的时候不用额外扫描不需要的数据,例如下面,简介可以储存1000个字,那么在查找的时候是相对耗时的,即使我们没有去查该字段的数据,分离之后,查找学生姓名的时候就不需要扫描简介字段了
在这里插入图片描述

(4)水平分表

水平分表和水平分库是类似的,单个表的数据量过大,那么查询的时间就会长,如果建立了索引,对插入、修改和删除操作就会有严重的影响

水平划分数据可以解决这个问题,可以按一定的逻辑去划分数据,不一定使用mod法,例如下面的例子:

由于业务需求,可能需要对各个年级的学生数据进行维护,例如划分课程等等,就可以按学生年级、专业这些相关字段去划分
在这里插入图片描述
(5)总结
水平分库、垂直分表、水平分表都使用了减少数据访问的原理对数据库操作做了优化,而垂直分库可解耦合,使得数据库变得更加灵活易维护

二、返回更少的数据

数据的传输是需要花费时间的,传输越多的数据,那么花费的时间就越多

(1)分页
一般来说,展示给用户的数据都会有分页的,那么查询的时候可以根据一些推荐算法对数据进行排序,用户需要更多数据的时候再查需要的数据,而不是将查到的数据一下子全部发送到客户端

(2)只返回需要的字段
通过去除不必要的返回字段可以提高性能,例:
调整前:select * from product where company_id=?;
调整后:select id,name from product where company_id=?;

优点:
1、减少数据在网络上传输开销
2、减少服务器数据处理开销
3、减少客户端内存占用
4、字段变更时提前发现问题,减少程序BUG
5、如果访问的所有字段刚好在一个索引里面,则可以使用纯索引访问提高性能。

缺点:增加编码工作量

三、减少交互次数
1、batch DML
如果插入1000条数据

通过for循环一条一条进行操作,那么需要和数据库建立1000次连
假如每次插入10条数据,那么需要建立100次连接接
假如每次插入100条数据,那么需要建立10次连接
那么是不是每次插入的数据量越多越好呢?不是的,批量插入的时候需要建立临时表,批量插入的数据越多,那么占用的空间越大,有内存溢出的风险

总的来说,适当地调节插入、修改、删除的批量操作的数量,可以降低数据库的连接次数,减少了网络通信使用的时间

mybatis plus也提供了批量操作的接口,默认单次处理的数据为1000条
在这里插入图片描述

2、In List
尽量不循环查询数据库,可以使用in条件批量查询,如果需要分离数据,可以使用程序分离,这样不仅减低数据库的连接次数,而且在没有索引的情况下降低了扫描数据库的次数

3、设置Fetch Size
数据查询出来需要从数据库传输到实体类中存储起来,这中间传输的时候需要建立连接通道,传输的速率有通道的大小决定,通道的大小可以通过调整Fetch Size调节,如果通道太小,传输数据就会很慢,如果过大,会浪费空间,有内存溢出的风险。所以调整Fetch Size优化性能的时候需要对数据量进行评估

mybatis可以使用fetchSize属性调节大小,网络上大家都说fetchSize设置在40-100比较合适,oracle默认是10,所以取10000条数据的时候就需要花费10秒钟,需要适当提高fetchSize来提高传输速度
在这里插入图片描述

4、使用存储过程

使用存储过程可以在一次连接做许多复杂的逻辑操作,查出的数据直接在数据库中处理,由此可以去掉连接和传输的时间花销,例如将一个表的数据处理后存到另一个表,传统的做法是取出数据到客户端,处理后再用insert语句插入到另一个表中,而存储过程却可以一步到位,直接取数据,处理,插入。最大的优点就是减少了数据在网络上传输开销

存储过程的收益并没有很大,又不容易维护,所以在实际的生产中很少使用,定时性的ETL任务或报表统计函数使用得比较多

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

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

相关文章

STM32单片机蓝牙APP宠物自动喂食器定时语音提醒喂食系统设计

实践制作DIY- GC00162---蓝牙APP宠物自动喂食器 一、功能说明&#xff1a; 基于STM32单片机设计---蓝牙APP宠物自动喂食器 二、功能说明&#xff1a; STM32F103C系列最小系统板LCD1602显示器DS1302时钟模块5个按键语音播报模块ULN2003步进电机模块LED灯板HC-05蓝牙模块&#x…

企升编辑器word编写插件

面向用户群体招投标人员&#xff0c;用统一的模板来编写标书&#xff0c;并最终合并标书。项目经理&#xff0c;编写项目开发计划书&#xff0c;项目验收文档等。开发人员&#xff0c;编写项目需求规格说明书、设计说明书、技术总结等文档。其他文档编写工作量较多的岗位人员。…

用html+javascript打造公文一键排版系统13:增加半角字符和全角字符的相互转换功能

一、实践发现了bug和不足 今天用了公文一键排版系统对几个PDF文件格式的材料进行文字识别后再重新排版&#xff0c;处理效果还是相当不错的&#xff0c;节约了不少的时间。 但是也发现了三个需要改进的地方&#xff1a; &#xff08;一&#xff09;发现了两个bug&#xff1a;…

智能优化算法——灰狼优化算法(PythonMatlab实现)

目录 1 灰狼优化算法基本思想 2 灰狼捕食猎物过程 2.1 社会等级分层 2.2 包围猎物 2.3 狩猎 2.4 攻击猎物 2.5 寻找猎物 3 实现步骤及程序框图 3.1 步骤 3.2 程序框图 4 Python代码实现 ​ 5 Matlab实现 1 灰狼优化算法基本思想 灰狼优化算法是一种群智能优化算法&a…

Flutter(八)事件处理与通知

1.原始指针事件处理 一次完整的事件分为三个阶段&#xff1a;手指按下、手指移动、和手指抬起&#xff0c;而更高级别的手势&#xff08;如点击、双击、拖动等&#xff09;都是基于这些原始事件的。 Listener 组件 Flutter中可以使用Listener来监听原始触摸事件 Listener({…

本地化部署自建类ChatGPT服务远程访问

本地化部署自建类ChatGPT服务远程访问 文章目录 本地化部署自建类ChatGPT服务远程访问前言系统环境1. 安装Text generation web UI2.安装依赖3. 安装语言模型4. 启动5. 安装cpolar 内网穿透6. 创建公网地址7. 公网访问8. 固定公网地址 &#x1f340;小结&#x1f340; 前言 Te…

基于gpt4all的企业内部知识问答服务应用搭建

文章目录 痛点项目缘起技术选型fine-tuningfew shot prompt engineering选定方案的特征描述 模型赛马gpt4all调优部署时踩坑python3.9 header缺失 -- 安装下缺失的就行运行时参数调优 代码分析项目代码库代码 效果展示例子1例子2 附录&#xff1a;所用的公司内部API文档例子&am…

c#设计模式-行为型模式 之 观察者模式

定义&#xff1a; 又被称为发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者 对象同时监听某一个主题对象。这个主题对象在状态变化时&#xff0c;会通知所有的观察者对象&#xff0c;使他们能够自 …

angular-mat-select 多选 实现按选择顺序排序

mat-select 正常情况下,多选后,已选项是按列表顺序进行排序,如果我想实现按照点击项目的顺序进行排序,我该如何做呢? [参考网址](Angular order of selected option in multiple mat-select - Stack Overflow) sortComparator是Angular Material中mat-select组件的一个属…

深度学习中的优化算法

文章目录 前言一、优化和深度学习1.1 优化的目标1.2 深度学习中的优化挑战1.2.1 局部最小值1.2.2 鞍点1.2.3 梯度消失 二、梯度下降2.1 一维梯度下降2.1.1 学习率 2.2 多元梯度下降2.3 自适应方法2.3.1 牛顿法2.3.2 其他自适应方法 三、随机梯度下降3.1 随机梯度更新3.2 动态学…

Flutter iOS 集成使用 flutter boost

在 Flutter项目中集成完 flutter boost&#xff0c;并且已经使用了 flutter boost进行了路由管理&#xff0c;这时如果需要和iOS混合开发&#xff0c;这时就要到 原生端进行集成。 注意&#xff1a;之前建的项目必须是 Flutter module项目&#xff0c;并且原生项目和flutter m…

Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动该地区金融平等

流支付正在成为一种全新的支付形态&#xff0c;Zebec Protocol 作为流支付的主要推崇者&#xff0c;正在积极的推动该支付方案向更广泛的应用场景拓展。目前&#xff0c;Zebec Protocol 成功的将流支付应用在薪酬支付领域&#xff0c;并通过收购 WageLink 将其纳入旗下&#xf…

grpcGateway配置

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

基于 CentOS 7 构建 LVS-DR 群集以及配置nginx负载均衡

目录 一、基于 CentOS 7 构建 LVS-DR 群集 1、前期准备 1、关闭防火墙 2、安装ifconfig 3、准备四台虚拟机 2、在DS上 2.1、配置LVS虚拟IP 2.2、手工执行配置添加LVS服务并增加两台RS 2.3、查看配置 3、在RS端&#xff08;第三台、第四台&#xff09; 上 3.1、配置W…

校对软件助力司法公正:确保法律文书准确无误

校对软件在司法系统中的应用可以助力司法公正&#xff0c;确保法律文书的准确性和无误性。以下是校对软件如何发挥作用&#xff1a; 1.确保准确性&#xff1a;校对软件可以自动检查法律文书中的语法、拼写和标点等方面的错误。通过及时发现和修正这些错误&#xff0c;可以确保文…

CycleGAN论文解读及代码实现

paper: https://arxiv.org/pdf/1703.10593.pdf github: https://github.com/aitorzip/PyTorch-CycleGAN 1 cycleGAN 小结 网络&#xff1a; 生成器2个&#xff1a;G_A&#xff0c;G_B 判别器两个&#xff1a; D_A&#xff0c;D_B损失函数8个 6个生成器损失函数 2个判别器损失…

玩转graphQL

转载至酒仙桥的玩转graphQL - SecPulse.COM | 安全脉搏 前言 在测试中我发现了很多网站开始使用GraphQL技术&#xff0c;并且在测试中发现了其使用过程中存在的问题&#xff0c;那么&#xff0c;到底GraphQL是什么呢&#xff1f;了解了GraphQL后能帮助我们在渗透测试中发现哪些…

【单片机】51单片机,TLC2543,驱动程序,读取adc

TLC2543 是一款 12 位精密模数转换器 (ADC)。 1~9、11、12——AIN0&#xff5e;AIN10为模拟输入端&#xff1b; 15——CS 为片选端&#xff1b; 17——DIN 为串行数据输入端&#xff1b;&#xff08;控制字输入端&#xff0c;用于选择转换及输出数据格式&#xff09; 16——…

Unity进阶--使用PhotonServer实现服务端和客户端通信--PhotonServer(一)

文章目录 Unity进阶--使用PhotonServer实现服务端和客户端通信服务器的安装和配置添加日志客户端的配置客户端和服务器的通信Dlc 出现vscode引用不好使的时候 Unity进阶–使用PhotonServer实现服务端和客户端通信 服务器的安装和配置 Photon的地址&#xff1a;https://www.ph…

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上&#xff0c;因此实现方案如下&#xff1a; (1) ceph集群开启mgr内置的exporter服务&#xff0c;用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…