为了账号安全,请及时绑定邮箱和手机立即绑定

让SQL飞起来

标签:
MySQL

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

使用高效的查询

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

  2. 参数是子查询时,使用连接代替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时,只有前方一致的匹配才能用到索引。如:

    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/著 吴岩昌/译

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
7
获赞与收藏
16

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消