尽可能使用筛选条件

  • 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原始表的数据量。