优化SQL的方法

2024-05-09 1008阅读

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

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]