赞
踩
来自组内分享,包含了比较常使用到的八点:
消耗更多的数据库服务器内存、CPU等资源。
占用网络资源,通过网络IO传输时,增加传输时间。
不会使用覆盖索引,出现大量的回表操作,降低SQL查询性能。
union可以去除多表合并后的重复数据;
union all可获取结果集的全部数据,包括重复数据。
占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限制,减少bug或误操作的影响。
适用于数据量较少,分页数不多的情况。
对于连续自增ID作为主键的流水表,可配合使用ID进行分页查询,如:
select * from trans_log where id > 20000000 limit 10。
如果是连续的唯一索引,也可使用between…and…,在唯一索引上进行分页。
相对连接查询,子查询使用in关键字实现,具有结构化,相对简单,但是需要创建和删除临时表,增加资源消耗。
使用join实现,但不适合join太多表,阿里巴巴开发者手册的规定,join表的数量不应该超过3个,join表数量太多时,会导致mysql在选错索引。
复杂的业务查询场景,可适当通过冗余数据,减少关联表的数量。
inner join,两个表交集数据,MySQL会自动选择两张表中的小表,去驱动大表。
left join,两个表的交集,以及左表剩余的数据,左表为驱动表。
建议:能用inner join时,不用left join。
索引可提升SQL效率,但索引需要额外的存储空间,而且还会有一定的性能消耗。
一般单表索引数量建议不超过5个。
高并发场景下,尽量使用联合索引,减少不必要的单字段索引。
一般SQL优化第一考虑的是索引优化,可使用explain命令,查看MySQL的执行计划,确认SQL是否有走索引。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。