首页 > 数据库 >sql优化思路以及方式

sql优化思路以及方式

时间:2024-05-13 13:52:15浏览次数:12  
标签:优化 数据库 使用 查询 索引 数据量 sql 思路 数据

后端服务的性能优化是一个永恒的话题。这一篇随笔主要记录一下在各种业务场景下,sql优化的一些思路以及方式。

note:
DML(data manipulation language)是数据操纵语言:它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。

DDL(data definition language)是数据定义语言:DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。

DCL(DataControlLanguage)是数据库控制语言:是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。

1.避免使用select *写查询语句。
原因:
-1.查询时需要解析成表的所有字段然后再查询,增加查询解析器的成本;
-2.select * 查询一般不走覆盖索引会产生大量的回表查询;
-3.业务场景中需要使用的一般是较少的某些字段,其他不需要使用的字段也查出来浪费CPU,内存资源。
-4.文本数据,大字段数据传输增加网络消耗。

2.小表驱动大表
释义:指用数据量较小,索引比较完备的表,然后使用索引和条件对大表进行数据筛选,从而减少数据计算量,提高查询效率。
简单来说就是写联合查询的时候,用数据量较少的表去连接数据量较大的表。BNL算法(BLOCK-nested-loop-join)

3.用链接查询代替子查询
原因:
-1.因为子查询需要执行两次数据库查询,一次是外部查询,一次是嵌套子查询。而链接查询可以减少数据库查询次数,从而提高效率。
-2.链接查询可以更好的利用数据库的索引,提高查询性能。子查询通常使用临时表或者内存表。而连接查询可以直接利用表上的索引。这意味着连接查询可以更快访问表中的数据,减少查询的资源消耗。
-3.对于大型数据集,使用连接查询通常比使用子查询更高效。子查询需要扫描整个表,连接查询可以走索引。

4.提fgroup by的效率
创建索引:如果你使用group by的列没有索引,那么查询可能会变得很慢。因此,可以创建一个或多个适当的索引来加速查询。

5.优化批量插入,修改的操作。
1.尽量提供批量插入,修改,删除的mapper接口。
2.如果单次操作数据数量过大,数据库响应也会很慢。可以用List相关工具包,将数据集拆分成较少量的list数据集,再for循环写入。

6.使用limit
1.提高查询效率
一个查询返回成干上方的数据行,不仅占用了大量的系统资源,也会占用更多的网络带宽,影响查询效率。使用LIMIT可以限制返回的数据行数,减轻了系统负担,提高了查询效率。
2.避免过度提取数据
对于大型数据库系统,从数据库提取大量数据可能导致系统崩溃。使用limit可以限制提取的数据量,避免过度提取数据,保护系统不受影响。
3.优化分页查询
分页查询需要查询所有的数据才能进行分页处理,这会浪费大量的系统资源和时间。使用limit优化分页查询可以只查询需要的数据行,缩短查询时间,减少资源浪费。
4.简化查询结果

7.使用union all代替union
union all:获取所有数据但是不去重
union:获取所有数据且去重,需要遍历,排序,比较,消耗cpu资源。
如果必须保证结果集不重复,可以在java代码中做去重排序。

8.join的表不宜过多
理由:查询效率下降:多表JOIN查询数据对比时间边长
1.系统负载增加:JOIN操作需要进行大量的计算,因此会导致系统负载增加。
2.维护难度加大:在一个连接了多个表的查询中,如果需要修改其中一个表的结构或内容,就可能会需要同时修改其他表的结构或内容。
因此,在数据库设计时,应该尽量减少JOIN操作的使用频率,并且简化表之间的关系,以提高查询效率和系统的性能。

9.控制索引数量

10.选择合理的字段类型

标签:优化,数据库,使用,查询,索引,数据量,sql,思路,数据
From: https://www.cnblogs.com/leidudu/p/18189062

相关文章

  • 网站速度优化技巧
    网站速度优化可确保您的网站快速加载并让访问者满意。以下是一些:最小化HTTP请求:每个图片、脚本和样式表都需要一个HTTP请求。查询越少,加载时间越快。考虑组合文件或使用精灵等技术来创建图片。优化图像:大的、未优化的图像会显着减慢您的网站速度。使用TinyPNG压缩图片,同......
  • HiveSQL
    1.表sublime格式化ctrl+kctrl+f--创建学生表DROPTABLEIFEXISTSstudent_info;createtableifnotexistsstudent_info(stu_idstringCOMMENT'学生id',stu_namestringCOMMENT'学生姓名',birthdaystringCOMMENT'出生日期',......
  • 手动执行SQL触发器id自增报错处理方式
      一、查询出触发器创建的sqlSELECTdbms_metadata.get_ddl('TRIGGER','TRI_XXX_STORAGE','XSY')AStrigger_sql FROMdual; 二、删除触发器DROPTRIGGERXSY.TRI_XSY_STORAGE;三、创建触发器CREATEORREPLACETRIGGERTRI_XSY_STORAGEBE......
  • 部署Prometheus Operator完整流程及踩坑解决思路
    环境信息软件版本号LinuxCentos7.9k8sv1.26.9Docker25.0.4kube-prometheusv0.13.0nginx-ingress-controllerv1.10.1K8S集群信息(提前安装好自己的集群,本文不再讲解集群的安装)主机名IPk8s-master192.168.2.11k8s-node01192.168.2.1......
  • Mysql 中的日期时间函数汇总
    日期和时间函数MySQL中内置了大量的日期和时间函数,能够灵活、方便地处理日期和时间数据,本节就简单介绍一下MySQL中内置的日期和时间函数。1CURDATE()函数CURDATE()函数用于返回当前日期,只包含年、月、日部分,格式为YYYY-MM-DD。使用示例如下:mysql>SELECTCURDATE();+------......
  • sqlserver2019安装
    说明:新版sqlserver安装分两部分:第一部分安装服务 第二部分安装管理工具 第一步:下载安装包 ed2k://|file|cn_office_professional_plus_2019_x86_x64_dvd_5e5be643.iso|3775004672|1E4FFA5240F21F60DC027F73F1C62FF4|/第二步:安装服务这里注意:    推荐第一种安......
  • SQL Server实战七:自定义数据类型、标量值、内嵌表值、多语句表值函数的操作
      本文介绍基于MicrosoftSQLServer软件,实现数据库用户自定义数据类型的创建、使用与删除,以及标量值、内嵌表值、多语句表值函数等用户定义函数的创建、使用、删除方法。目录1用SQL语句创建一个用户定义的数据类型Idnum2使用Idnum创建学生表STUDENT与教师表TEACHER3交互式......
  • Mysql事务特性和Mysql事务隔离级别
    事务执行异常处理、提交、回滚:https://www.cnblogs.com/xsj1989/p/17774735.htmlMysql默认的执行引擎是innoDB,支持事务,行级锁定和外键。Mysql事务特性1.原子性:事务是一个不可分割的整体,要么全部成功,要么全部失败。2.一致性:系统从一个正确状态迁移到另一个正确状态。3.隔离性:每个......
  • 了解GaussDB SQL中CASE表达式
    本文分享自华为云社区《GaussDBSQL基本语法示例-CASE表达式》,作者:Gauss松鼠会小助手2。一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。二、CA......
  • MySQL中的FOUND_ROWS()与ROW_COUNT()函数
    参考:https://www.cnblogs.com/JennyYu/p/16888090.htmlFOUND_ROWS():found_rows()用于查询同一连接下,上一条执行select查询返回的行数,包括show语句返回的行数。中间可以插入执行dml语句,返回依然是上一条select语句返回的行数。使用sql_calc_found_rows与found_rows()组合,可以查......