慢SQL优化总结

本文详细总结了SQL优化的各种策略,包括in与exists的使用场景、not in与not exists的选择、like条件下的索引优化、join操作的注意事项、滥用索引的危害、insert语句的优化、删除重复数据的方法、连表更新的效率提升、null处理、日期查询的最佳实践、count函数的使用以及对表设计的理解和频繁查询的管理。通过这些优化技巧,可以显著提高SQL查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于in和exists的使用

1.当父查询结果集小于子查询结果集则选择exists,如果父查询结果集大于子查询结果集选择in。(可尝试等价改写)
in和exists都有子查询优化,提升子查询,有时候这两的执行计划一样。需要注意的是如果子查询包含了父查询里面的条件,in不会被优化。
2.in里面的值一般不超过100个
3.单表postgresql的in和个数关系不大,都可以走索引。
4.当有连表并且有in的个数很多,count的时候需要解析这些值很慢,所以可以封装成any valuse的形式来求count,而分页还是使用in。此例主要是in和any(values)的等价改写
any values:c_bh=any(values(‘53’),(‘530001’),(‘530002’),…)

postgresql在查询的时候会自动做表连接。将两张表做hash join操作:
1.EXPLAIN SELECT * FROM X WHERE x_num IN(SELECT y_num FROM y);
2. QUERY PLAN
3.----------------------------------------------------------------------
4. Hash Join (cost=23.25…49.88 rows=350 width=86)
5. Hash Cond: (x.x_num = y.y_num)
6. -> Seq Scan on x (cost=0.00…17.00 rows=700 width=86)
7. -> Hash (cost=20.75…20.75 rows=200 width=4)
8. -> HashAggregate (cost=18.75…20.75 rows=200 width=4)
-> Seq Scan on y (cost=0.00…17.00 rows=700 width=4)

关于not in和not exists的使用

1.建议使用not exists,不使用not in
2.not in不能提升子查询
3.当not in中包含null值时,无结果集

like条件无索引

1.前,后模糊匹配,都需要建立索引,防止大量的全表扫描。
2.全模糊匹配程序上可以控制输入的字符个数,防止全表扫描,返回大量数据。

对join,left join的使用,将条件放到on和where后面的区别问题

postgresql中left join中将条件放入 on和where的区别。
1.on是肯定会返回左表的数据,所以在on里面的条件都会返回,如果想要过滤数据则需要在where中加条件
2.由于 inner join是两表都有的,所以,返回的结果是和where条件一样的。
示例:
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

滥用索引

索引过多:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Walter Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值