优化SQL的方法

ops/2024/9/24 10:56:05/

来自组内分享,包含了比较常使用到的八点:

  • 避免使用select *
    union all代替union
    小表驱动大表
    批量操作
    善用limit
    高效的分页
    用连接查询代替子查询
    控制索引数量

一、避免使用select *

消耗数据库资源

消耗更多的数据库服务器内存、CPU等资源。

消耗网络资源

占用网络资源,通过网络IO传输时,增加传输时间。

不走覆盖索引

不会使用覆盖索引,出现大量的回表操作,降低SQL查询性能。

二、union all代替union

特性

union可以去除多表合并后的重复数据;
union all可获取结果集的全部数据,包括重复数据。

union更加消耗资源

占union的去重过程需要遍历、排序、比较等操作,消耗时间及CPU资源等。

三、小表驱动大表

常用操作

in,先执行内层子查询,再执行外层,如:
select a.txn_no,a.ecif_no from trans_log a where a.ecif_no in (
select b.ecif_no from client_info b where a.ecif_no = b.ecif_no and ecif_status = ‘L’);

exists,先执行外层,再执行内层子查询,如:
select a.ecif_no from client_info a where a.create_date > ‘2024-04-16’and exists(
select 1 from trans_log b where a.ecif_no = b.ecif_no);

小表驱动大表

in适用于外层大表,内层小表;
exists适用于外层小表,内层大表。

四、批量操作

减少多次请求数据库的消耗

如多条数据插入数据库,使用批量插入insert into xxx_table(a, b, c) values(1, 2, 3), (4, 5, 6);

把握单次批量处理数量

每批次建议不超过500,数据量较多时,仍需要分多次请求。

五、善用limit

查询

使用limit明确查询返回记录数,减少资源消耗。

更新和删除

通过合理使用limit限制,减少bug或误操作的影响。

六、高效的分页

使用limit分页

适用于数据量较少,分页数不多的情况。

使用大于 + limit分页

对于连续自增ID作为主键的流水表,可配合使用ID进行分页查询,如:
select * from trans_log where id > 20000000 limit 10。

使用between分页

如果是连续的唯一索引,也可使用between…and…,在唯一索引上进行分页。

七、用连接查询代替子查询

子查询

相对连接查询,子查询使用in关键字实现,具有结构化,相对简单,但是需要创建和删除临时表,增加资源消耗。

连接查询

使用join实现,但不适合join太多表,阿里巴巴开发者手册的规定,join表的数量不应该超过3个,join表数量太多时,会导致mysql在选错索引。
复杂的业务查询场景,可适当通过冗余数据,减少关联表的数量。

inner join,两个表交集数据,MySQL会自动选择两张表中的小表,去驱动大表。
left join,两个表的交集,以及左表剩余的数据,左表为驱动表。
建议:能用inner join时,不用left join。

八、控制索引数量

优缺点

索引可提升SQL效率,但索引需要额外的存储空间,而且还会有一定的性能消耗。

控制索引数量

一般单表索引数量建议不超过5个。
高并发场景下,尽量使用联合索引,减少不必要的单字段索引。

优化索引

一般SQL优化第一考虑的是索引优化,可使用explain命令,查看MySQL的执行计划,确认SQL是否有走索引。


http://www.ppmy.cn/ops/25163.html

相关文章

Python发送digest认证的请求:requests.auth.HTTPDigestAuth/httpx.DigestAuth

近日在做摄像头接口的调试,需要用到Digest认证,经过试验,代码如下: 一、同步版(pip install requests) import requests from requests.auth import HTTPDigestAuthhost https://192.168.0.2 path /api/xxx path2 /another/a…

Git 核心概念与实操

这里写目录标题 1 版本回退2 工作区、暂存区、本地仓库、远程仓库3 分支合并3.1 Fast-forward3.2 Recursive3.3 Ours & Theirs 4 处理冲突5 git stash 存储工作区 参考:https://www.liaoxuefeng.com/wiki/896043488029600 1 版本回退 原文链接:http…

C++ 核心编程(2)

4.6.8 菱形继承 #include<iostream> #include <bits/stdc.h> using namespace std; //菱形继承 //动物类 class Animal{ public:int mAge; }; //羊 class Sheep : public Animal{}; //驼 class Tuo : public Animal{}; //羊驼 class SheepTuo:public Sheep,pu…

Json-server 模拟后端接口

json-server&#xff0c;模拟rest接口&#xff0c;自动生成增删改查接口。(官网地址&#xff1a;json-server - npm) 使用方法&#xff1a; 1. 安装json-server&#xff0c;npm i json-server -g 2. 创建json文件&#xff0c;文件中存储list数据&#xff0c;db.json {"…

实施运维工程师面试题

实施工程师面试题 (一)电脑网络,软硬件以及软件实施工程师要掌握的基本常识 两台电脑都在同一个网络环境中,A电脑访问不到B电脑的共享文件。此现象可能是哪些方面所至?如何处理?首先你要确定是不是在一个工作组内,只有在一个工作组内才可以共享文件,查看共享服务是否被…

stm32 hid自定义接收发送程序开发过程记录

cubleMX配置如下 修改端点描述符一次传输的数据大小 根据cubelMX标准在这里修改 编译错误 直接修改&#xff08;因为没有使用nodef &#xff09;编译通过 修改报告描述符&#xff08;默认的描述符无法传输数据&#xff09; 参考&#xff1a;USB协议详解第10讲&#xff08;USB描…

创维汽车亮相2024北京车展 100kW直流放电技术颠覆传统补能体系

在新质生产力的推动下&#xff0c;汽车行业正面临重塑产业格局、实现转型升级的迫切需求。4月25日&#xff0c;以“新时代 新汽车”为主题的2024北京国际汽车展览会拉开帷幕。作为拥有深厚制造业基因的企业&#xff0c;创维汽车于当日下午举办主题为“颠覆-开启移动补能新时代”…

电机介绍c

文章目录 1233.13.2 3.33.43.5 4 1 2 驱动用 赛车电源 控制用 打印机 停在那个位置 3 舵机 比较小&#xff1f; 3.1 DC就是直流 BDC操控方便 接个5号电池 正负极一反 电机就反&#xff08;电压控制 电压越大 转速越高&#xff09;噪声大这里寿命是连续 工作的&#xff08;寿命…