优化SQL的方法

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

  • 避免使用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是否有走索引。

相关推荐
fen_fen8 小时前
Oracle建表语句示例
数据库·oracle
砚边数影9 小时前
数据可视化入门:Matplotlib 基础语法与折线图绘制
数据库·信息可视化·matplotlib·数据可视化·kingbase·数据库平替用金仓·金仓数据库
orange_tt9 小时前
Djiango配置Celery
数据库·sqlite
云小逸10 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
肉包_51110 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
霖霖总总11 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
此刻你12 小时前
常用的 SQL 语句
数据库·sql·oracle
それども12 小时前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql
·云扬·12 小时前
MySQL Binlog 配置指南与核心作用解析
数据库·mysql·adb
天空属于哈夫克313 小时前
Java 版:利用外部群 API 实现自动“技术开课”倒计时提醒
数据库·python·mysql