SQL进阶教程之1.11 让SQL飞起来

技巧1:使用高效的查询
原因:
1 使用连接列建立索引,查询时只需要查询索引不需要查询另一个表
2 查到满足条件的行就会终止查询,不会像 in一样扫描全表

  • 当用到子查询时,最好是用 exists而不是 in
  • 大多数时候not exists 和 not in查询结果相同,但exists用于子查询结果更快
表classes_a
表classes_b

查询方法1:使用in子句

查询方法2:使用exists语句(推荐)

技巧2:避免排序
原因:当内存不足,需要在硬盘上排序时,对数据库性能影响很大,因此要避免排序

  • 涉及到排序的语句

    • group by子句
    • order by子句
    • 聚合函数
    • distinct
    • 集合运算符(union/intersect/except)
    • 窗口函数(rank/row_number)
  • 尽量使用union/intersect/except all 而非union/intersect/except,因为后者会根据排序筛选信息

  • distinct也需要进行排序来去重,因此尽量用exists代替distinct

  • 在极值函数max()/min()函数中使用索引而不是字段,仅扫描索引而非全表

  • 能写在where里的条件不要写在having子句里

    • where可以筛选出一部分行而不用选择全部数据
    • having子句是根据聚合后的结果排序,不能继承原表的索引结构

技巧3:索引
原因:当使用索引查询时,不需要扫描全表,只需要查找索引即可,可大大提升效率

  • 当索引出现在条件表达式中,左侧应该是原始字段而非原始字段+运算

  • 通常索引字段不存在null,使用null和is null 会使索引无法使用

  • 使用否定形式not in/<>/!=也无法使用索引

  • 建立联合索引时,使用or的效率要比and更低

  • 联合索引时,字段的顺序与原表中顺序一致(如列A and 列B and 列C,顺序与原来的顺序一致)

  • 使用like谓词时,只有前方一致即'x%'才能匹配到索引

  • 需要进行类型转换时显示类型转换,如cast(值,as char(2))

技巧4:减少中间表
原因:1 中间表耗费内存资源 2 中间表索引不容易用到,因此需要尽量减少

  • 尽量在group by语句后直接使用having筛选,而不是group by结果作为子句+where筛选
  • 需要对多个字段使用in时,把他们汇总到一列,如 where 列a in(select.... from) + where 列b in(select.... from)= where a||b in (select a||b ...)
  • 先进行连接在进行聚合
  • 合理使用视图,特别避免在视图中使用聚合函数和聚合运算符

你可能感兴趣的:(SQL进阶教程之1.11 让SQL飞起来)