mysql源码简单分析

1.sql_parse.cc

    (1)bool all_tables_not_ok(THD *thd, TABLE_LIST *tables):返回值为true时表明所有表都未准备好,应该忽略。

    (2)bool check_database_filters(THD *thd, const char* db, enum_sql_command sql_cmd) :使用此函数时,replicate_ignore_db和replicate_do_db优先于wlid_do规则执行。返回true时表明不应该从执行操作中筛选出查询操作。(在主从同步的环境中,replicate-ignore-db和replicate-do-db会使主服务器上发生的表更新在从服务器上不被执行,replicate-wlid-do-db会保持主从服务器的更新)

    (3)bool some_non_temp_table_to_be_updated(THD *thd, TABLE_LIST *tables):返回1时更新非临时表。

    (4)bool stmt_causes_implicit_commit(const THD *thd, uint mask):根据语句的要求判断是否隐式提交事务要求。

    (5)void init_update_queries(void):创建一个命令数组,将不同的更新表的命令设置为不同的初始动作。

       (6)bool do_command(THD *thd):从连接中读一个命令并执行(在线程中重复调用)其中调用dispatch_command()函数。

    (7)static my_bool deny_updates_if_read_only_option(THD *thd,TABLE_LIST *all_tables) :mysql_execute_command()函数的辅助函数,用来决定处于只读模式下时是否执行更新命令,对于非临时表的更新选择执行,临时表的更新不执行。

    (8)static inline bool is_timer_applicable_to_statement(THD *thd)、static inline ulong get_max_execution_time(THD *thd)、static inline bool set_statement_timer(THD *thd)、void reset_statement_timer(THD *thd)与当前线程的时间有关。

    (9)bool dispatch_command(THD *thd, const COM_DATA *com_data, enum enum_server_command command):执行不同类型的命令。对于query,主要看case COM_QUERY部分:alloc_query()(从连接中读取命令保存到thd->query中)->  MYSQL_QUERY_START()(dtrace开始,用于实时跟踪mysql)->  PSI开始,用于实时记录数据库操作  ->  thd->profiling.set_query_source()分配资源->  parser_state.init()初始化解析器->  mysql_parse()生成解析树。

    (10)bool shutdown(THD *thd, enum mysql_enum_shutdown_level level, enum enum_server_command command):关闭mysqld连接。

    (11)bool alloc_query(THD *thd, const char *packet, size_t packet_length):

    (12)int mysql_execute_command(THD *thd, bool first_level):执行解析后保存在lex->sql_command中的命令。其中LEX *const lex= thd->lex使得lex中保存解析后的语法树;all_tables保存查询中需要的所有表。case SQLCOM_SELECT表明当命令是select时应该执行的操作:select_precheck(thd, lex, all_tables, first_table)  ->  execute_sqlcom_select(thd, all_tables);

    (13)static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables):获取解析树中的结果部分:Query_result *result= lex->result  ->  res= handle_query(thd, lex, result, 0, 0)  ->  MYSQL_SELECT_DONE((int) res, (ulong) thd->current_found_rows)。

    (14)void mysql_parse(THD *thd, Parser_state *parser_state):首先查看query_cache中有没有缓存的query,如果没有,初始化解析树的语法。首先初始化,为后续检查cache做准备mysql_reset_thd_for_next_command(thd)、lex_start(thd)  ->  当query_cache没有命中时解析sql语句 parse_sql(thd, parser_state, NULL)  ->  MYSQL_QUERY_EXEC_START( const_cast(thd->query().str),thd->thread_id(),(char *) (thd->db().str ? thd->db().str : ""),(char *) thd->security_context()->priv_user().str,(char *) thd->security_context()->host_or_ip().str,0);  ->  mysql_execute_command(thd, true); ->  MYSQL_QUERY_EXEC_DONE(error)。

    (15)bool st_select_lex::init_nested_join(THD *thd)、TABLE_LIST *st_select_lex::end_nested_join(THD *thd)、TABLE_LIST *st_select_lex::nest_last_join(THD *thd):嵌套连接

    (16)bool st_select_lex_unit::add_fake_select_lex(THD *thd_arg):用于select......order by语句;void add_join_on(TABLE_LIST *b, Item *expr):用于join......on语句;

    (17)bool parse_sql(THD *thd,Parser_state *parser_state,Object_creation_ctx *creation_ctx):其中调用了sql_yacc.cc中的MYSQLparse()函数,并进入这个函数具体解析sql语句。

    (18)const CHARSET_INFO* merge_charset_and_collation(const CHARSET_INFO *cs, const CHARSET_INFO *cl):用于CHARACTER SET cs [ COLLATE cl ]语句。

2.sql_select.cc

     (1)bool handle_query(THD *thd, LEX *lex, Query_result *result,ulonglong added_options, ulonglong removed_options):处理数据查询操作,针对select、insert......select、replace......select、update和delete语句,返回false表示成功。进入这个函数处理查询包括五个步骤:准备、锁表、优化、执行查询计划和清除。unit->set_prepared()  ->  lock_tables()->  select->optimize(thd)  ->  lex->is_explain()   

    (2)bool types_allow_materialization(Item *outer, Item *inner):当执行嵌套查询时,判断外层查询结果和内层查询结果类型是否一致。

    (3)bool JOIN::prepare_result():在执行或描述join之前准备join的结果。

   (4)bool SELECT_LEX::optimize(THD *thd):主要调用join->optimize()函数优化join。

你可能感兴趣的:(mysql源码简单分析)