SQL优化


1、参数是子查询时,使用exists替代in,或者使用连接替代in,虽然in非常方便,但是会成为性能瓶颈

2、会进行排序的代表性运算有:
group by
order by
聚合函数(sum count avg max min)
distinct
集合运算符(union intersect except)
窗口函数(rank row_number等)

通过指定带索引的列作为group by和order by的列,可以实现高速查询

3、使用索引时,条件表达式的左侧应该是原始字段,把运算的表达式放到查询条件的右侧,否则在查询条件的左侧使用时不能用到索引

下面几种否定形式不能用到索引,会进行全表扫描
<>
!=
not in

4、在col1和col2上分别建立了不同的索引,或者建立了(col1,col2)这样的联合索引时,如果使用or连接条件,那么要么用不到索引,要么用到了但是效率比and差得多

5、联合索引的第一列必须写在查询条件的开头,而且索引中列的顺序不能颠倒

6、使用like时,只有前方一致的匹配才能用到索引

7、默认的类型转换不仅会增加额外的性能开销,还会导致索引不可用,所以在需要类型转换时显式地进行转换

8、sql中子查询的结果会被看成一张新表,频繁使用中间表会带来2个问题,一是展开数据需要耗费内存资源,二是原始表中的索引不容易使用到,特别是聚合时,因此尽量减少中间表的使用可以提升性能

9、需要对多个字段使用in时,将它们汇总到一处,如
select * from address where id ||sate||city in (select id||state||city from addressn)
或者 select * from address where (id,sate,city) in (select id,state,city from addressn)

第二种写法比第一种更好,不用担心连接字段时出现的类型转换问题,且不会对字段进行加工,因此可以使用索引

10、连接和聚合同时使用时,先进行连接操作可以避免产生中间表

11、视图的定义语句中包含以下运算时,sql会非常低效,执行速度也会变得非常慢
聚合函数(sum count avg max min)
集合运算符(union intersect except等)

要避免在视图中进行聚合操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值