让SQL飞起来
本文最后更新于:2022年4月1日 上午
作为一名JAVA开发者,对SQL的使用是必不可少的,当数量级别达到一定量的时候,一个好的SQL可以让程序跑的更顺畅。最近也不是很忙,就将双十一购买的这本《SQL进阶教程》阅读了前面一部分,给我的感受就是有种醍醐灌顶的感觉,也让我对SQL有了进一步的理解,里面的知识点很好的解决了在工作中经常会遇到的问题。下面是部分内容,推荐给大家。
使用高效的查询
- 参数是子查询时,使用EXISTS代替IN
如果连接列上建立了索引,只需查询索引即可;
如果使用exists,那么只查到一行数据满足条件就会终止查询,不像IN会扫描全表。 - 参数是子查询时,使用连接代替IN
避免排序
会进行排序的代表性的运算:GROUP BY
子句ORDER BY
子句
聚合函数( SUM
、COUNT
、AVG
、MAX
、MIN
)DISTINCT
集合运算符( UNION
、INTERSECT
、EXCEPT
)
窗口函数( RANK
、ROW_NUMBER
)
尽量避免无谓的排序。
使用 ALL
可选项不会进行排序。
使用 EXISTS
代替 DISTINCT
。
极值函数中使用索引( MAX
、MIN
)
能写在 WHERE
子句里的条件不要写在 HAVING
子句里。HAVING
子句是针对聚合后生成的视图进行筛选的,但是很多时候聚合后的视图都没有继承原表的索引结构。
在 GROUP BY
子句和 ORDER BY
子句中使用索引
利用索引
使用索引时,条件表达式的左侧应该是原始字段。
指定 IS NULL
和 IS NOT NULL
会使得索引无法使用。
<>、!=、NOT IN
等否定形式不能用到索引。
使用 OR
索引无法使用,除非是位图索引,但这会增大性能的开销。
使用联合索引时,列的顺序错误,会导致索引无法使用。如果无法保证查询条件里列的顺序与索引一致,可以将联合索引拆分为多个索引。
使用 LIKE
时,只有前方一致的匹配才能用到索引。如:
1 |
|
默认的类型转换不仅会增加额外的性能开销,还会导致索引不可用,在需要类型转换的时候显示地进行类型转换(转换要写在条件表达式的右边)。
减少中间表
频繁使用中间表会带来两个问题:1.展开数据需要耗费内存资源,2.原始表中的索引不容易使用到。尽量减少中间表的使用也是提升性能的一个方法。
先进行连接再进行聚合。
合理使用视图。
参考书籍:《SQL进阶教程》[日]MICK/著 吴岩昌/译
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!