优化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是否有走索引。

相关推荐
updayday8545 分钟前
印染产线电脑进程异常占用资源却要逐台排查 - Ping64 远程进程管理
大数据·网络·数据库·安全·智能路由器
QYRdata17 分钟前
年复合增长率8.2%!2026-2032年数据库开发服务赛道增长动能持续释放
数据库·服务发现·数据库开发·恒州博智
坊钰19 分钟前
【LangGraph框架入门级】12. 人机交互:interrupt 中断与 Command 恢复
开发语言·数据库·python·人机交互·ai编程·langgraph
龙腾AI白云25 分钟前
世界模型与智能体协同推理逻辑
大数据·数据库·知识图谱·pygame
ben9518chen35 分钟前
数据库系统概述
数据库
花间相见41 分钟前
【计算基础|MySQL03】【上手】多表查询与聚合
数据库·mysql
小羊没烦恼!1 小时前
T-SQL查询高级—SQL Server索引中的碎片和填充因子
开发语言·前端·javascript·数据库·后端·python·web安全
the局外人1 小时前
学会 SQLAlchemy 搭建 Python 与 MySQL 之间的数据访问桥梁 🚀
后端·python·sql
lv__pf1 小时前
redis【TL redis(6)】
数据库·redis·缓存