SQL进阶之性能优化

SQL性能优化

越前须知(雾)

  • 本系列参考《SQL进阶教程》1,DBMS选用MySQL。
  • 本系列不涉及数据库安装与基础语句,对初学者存在一定门槛;基础知识建议阅读《SQL必知必会(第四版)》与《SQL基础教程(第二版)》。
  • 本篇主题为HAVING子句进阶用法,基础用法见同系列前文。

概述

  • 使用高效的查询
  • 避免排序
  • 使用索引
  • 减少中间表

使用高效的查询

  1. 参数是子查询时,用EXISTS代替IN
  2. 参数是子查询时,用连接代替IN

避免排序

涉及排序的运算:

  • GROUP BY
  • ORDER BY
  • 聚合函数(SUM、COUNT、AVG、MAX、MIN)
  • DISTINCT
  • 集合运算符(UNION、INTERSECT、EXCEPT)
  • 窗口函数(RANK、ROW_NUMBER、DENSE_RANK)

避免排序的方法:

  1. 若结果允许重复,使用 UNION ALL 而不是 UNION
  2. 用 EXISTS 代替 DISTINCT
  3. 在极值函数中使用索引(MAX/MIN)
  4. 在 GROUP BY 和 ORDER BY 子句中使用索引

使用索引

  1. 在索引字段上进行运算
  2. 使用联合索引(col_1, col_2, col_3)时,必须从联合索引中第一列开始,且索引中位置不能颠倒(位置颠倒后性能变差)
  3. 使用 Like 谓词时,只有前方一致的匹配才能用到索引,如 ‘a%’,类似’%a%’、’%a’均不行

减少中间表

频繁使用表会导致两个问题:

  • 展开数据需要耗费内存资源
  • 原始表中的索引不容易被使用(特别是聚合时)

减少中间表的方法:

  1. 对多个字段使用 IN 谓词时,将它们汇总到一处,如 CONCAT(A, B) 比用两个 IN 子查询性能好
  2. 合理使用视图,若视图中存在大量聚合函数、集合运算符,整体语句性能差

  1. MICK[日] 《SQL进阶教程》 ↩︎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值