让SQL飞起来

本文最后更新于:2022年4月1日 上午

作为一名JAVA开发者,对SQL的使用是必不可少的,当数量级别达到一定量的时候,一个好的SQL可以让程序跑的更顺畅。最近也不是很忙,就将双十一购买的这本《SQL进阶教程》阅读了前面一部分,给我的感受就是有种醍醐灌顶的感觉,也让我对SQL有了进一步的理解,里面的知识点很好的解决了在工作中经常会遇到的问题。下面是部分内容,推荐给大家。

使用高效的查询

  1. 参数是子查询时,使用EXISTS代替IN
    如果连接列上建立了索引,只需查询索引即可;
    如果使用exists,那么只查到一行数据满足条件就会终止查询,不像IN会扫描全表。
  2. 参数是子查询时,使用连接代替IN

避免排序

会进行排序的代表性的运算:
GROUP BY 子句
ORDER BY 子句
聚合函数( SUMCOUNTAVGMAXMIN
DISTINCT
集合运算符( UNIONINTERSECTEXCEPT )
窗口函数( RANKROW_NUMBER
尽量避免无谓的排序。

使用 ALL 可选项不会进行排序。

使用 EXISTS 代替 DISTINCT

极值函数中使用索引( MAXMIN

能写在 WHERE 子句里的条件不要写在 HAVING 子句里。HAVING 子句是针对聚合后生成的视图进行筛选的,但是很多时候聚合后的视图都没有继承原表的索引结构。

GROUP BY 子句和 ORDER BY 子句中使用索引

利用索引

使用索引时,条件表达式的左侧应该是原始字段。

指定 IS NULLIS NOT NULL 会使得索引无法使用。

<>、!=、NOT IN 等否定形式不能用到索引。

使用 OR 索引无法使用,除非是位图索引,但这会增大性能的开销。

使用联合索引时,列的顺序错误,会导致索引无法使用。如果无法保证查询条件里列的顺序与索引一致,可以将联合索引拆分为多个索引。

使用 LIKE 时,只有前方一致的匹配才能用到索引。如:

1
2
3
select * from sometable where col_1 like '%a';  -- 不会使用索引  
select * from sometable where col_1 like '%a%'; -- 不会使用索引
select * from sometable where col_1 like 'a%'; -- 会使用索引

默认的类型转换不仅会增加额外的性能开销,还会导致索引不可用,在需要类型转换的时候显示地进行类型转换(转换要写在条件表达式的右边)。

减少中间表

频繁使用中间表会带来两个问题:1.展开数据需要耗费内存资源,2.原始表中的索引不容易使用到。尽量减少中间表的使用也是提升性能的一个方法。

先进行连接再进行聚合。

合理使用视图。

参考书籍:《SQL进阶教程》[日]MICK/著 吴岩昌/译