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

相关推荐
计算机毕设定制辅导-无忧学长3 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
程序员柳4 小时前
基于微信小程序的校园二手交易平台、微信小程序校园二手商城源代码+数据库+使用说明,layui+微信小程序+Spring Boot
数据库·微信小程序·layui
梦在深巷、4 小时前
MySQL/MariaDB数据库主从复制之基于二进制日志的方式
linux·数据库·mysql·mariadb
IT乌鸦坐飞机4 小时前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
IT_10244 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
祁思妙想6 小时前
八股学习(三)---MySQL
数据库·学习·mysql
惊骇世俗王某人6 小时前
1.MySQL之如何定位慢查询
数据库·mysql
程序员张36 小时前
SQL分析与打印-p6spy组件
spring boot·sql·mybatis·mybatisplus·p6spy
秦歌6667 小时前
向量数据库-Milvus快速入门
数据库·milvus
Edingbrugh.南空8 小时前
Flink SQLServer CDC 环境配置与验证
数据库·sqlserver·flink