MySQL内核技术之aggregation(聚合操作)

在数据库技术中,Aggregation function又称之为set function,其含义为输入为一个set,输出为聚合结果。具体包括:


COUNT()

AVE()

MN()

MAX()

SUM()


Aggregation function有两种用法,一种单独使用,另一种是和GROUP联合使用。我们先讨论单独使用的情形。 


当单独使用的时候,其输出只有一条结果。在MySQL的源码中,涉及到两个位置标记QUERY是否使用了aggregation function,这两个位置都位于st_select_lex类中(sql_lex.h):


class st_select_lex {
  /**
    @return true if this query block is implicitly grouped and returns exactly
    one row, which happens when it does not have a HAVING clause.
  */
  bool is_single_grouped() const
  {
    return m_agg_func_used &&
           group_list.elements == 0 &&
           m_having_cond == NULL;
  }
  
  bool m_agg_func_used; //

/**
    True if contains or aggregates set functions.
    @note this is wrong when a locally found set function is aggregated
    in an outer query block.
  */
  bool with_sum_func;

}

看到了吧,有两个成员变量m_agg_func_used和with_sum_func,都是用来标记该query是否使用了aggregation function。其中with_sum_func是在parse阶段就被赋值了,而with_sum_func是在handle_query中(select->prepare)被赋值的,也就是在parse之后,optimize之前被赋值的。


这两个变量的作用实际上重复了,本人怀疑是不同的开发人员引入了各自的变量导致的。


待续。。。



你可能感兴趣的:(MySQL内核技术之aggregation(聚合操作))