优化SQL的方法

优化SQL的方法

码农世界 2024-05-15 前端 77 次浏览 0个评论

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

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

转载请注明来自码农世界,本文标题:《优化SQL的方法》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,77人围观)参与讨论

还没有评论,来说两句吧...

Top