尽可能使用筛选条件
- HybridDB for MySQL可以对任意列做过滤(一般建表通过
index_all='Y'
声明默认全索引),所以用户使用不需要考虑组合索引、谓词顺序和数量等问题,尽量多做筛选。
- 过滤条件尽量使用折叠好了的谓词,比如使用
ds='2017-01-01'
而不用ds=date('2017-01-01')
。如果出现没有提前折叠掉的常量,会影响查询的性能。
Join使用的指导原则
- 采用事实表与维度表Join,会有较高的性能。
- Join的两张表尽量按一级分区键作为join key,会有较高的性能。
- 如果有非一级分区的列要join,那最好增加where条件减少参与join的数据量。
- 如果有非一级分区的列要join,要考虑join的倾斜问题,是否会产生过多的null值。
- 如果有其他非一级分区的列要join,最好将一级分区键一起join,即多个join key,其中包含一级分区键。
- 如果出现一级分区键不对齐和对齐混合的多个join,为了提高性能,尽量把其中分区键对齐的join写在一起,分区键不对齐的写在一起。
- right outer join尽量rewrite成left outer join。
- 如果Join的where条件中的第一级谓词是OR,并且cond1 OR cond2的条件有左表也有右表,业务上应该考虑rewrite成join where cond1 union all join where cond2的形式,这样性能会更好。
- outer join的on和where作用域不同。on是作用于join的过程,where是作用于join之后的结果,所以应该将能在join的时候提前过滤的条件写在on上,也可以写在join表的子查询里,这样可以减少join原始表的数据量。