美文网首页
SQL进阶教程之1.11 让SQL飞起来

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

作者: anti酱 | 来源:发表于2021-11-27 15:05 被阅读0次

    技巧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飞起来

          本文链接:https://www.haomeiwen.com/subject/fstqxrtx.html