技巧1:使用高效的查询
原因:
1 使用连接列建立索引,查询时只需要查询索引不需要查询另一个表
2 查到满足条件的行就会终止查询,不会像 in一样扫描全表
- 当用到子查询时,最好是用 exists而不是 in
- 大多数时候not exists 和 not in查询结果相同,但exists用于子查询结果更快
查询方法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 ...)
- 先进行连接在进行聚合
- 合理使用视图,特别避免在视图中使用聚合函数和聚合运算符
网友评论