Home >Database >Mysql Tutorial >MySQL命令解析主要函数调用

MySQL命令解析主要函数调用

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-07 17:07:021116browse

进入一个客户端请求线程的函数调用:handle_connections_sockets create_new_thread start_c

进入一个客户端请求线程的函数调用:
handle_connections_sockets
            create_new_thread
                       start_cached_thread             /*使用线程池*/
                       handle_one_connection         /*新线程*/

handle_one_connection是处理客户端请求的线程函数,其中调用的核心函数是do_command,用于对用户命令依次进行处理。

do_command主要函数调用
    my_net_read(net) ; /*读取网络数据包并写入net结构体中*/
    dispatch_command ; /*处理命令的接口*/

.....................................
dispatch_command函数是各种类型命令的接口,以多个case语句来区分,,具体的实现在sql/sql_*.cc
switch(command):
case COOM_INIT_DB:
……
……
……
case COM_QUERY            /*select命令类型*/
        alloc_query() ; /*将查询复制到thd->query中*/
        mysql_parse(); /*准备进入语法解析器*/

……........................................................
mysql_parse用于处理select类型的查询,主要包括:
    query_cache_send_result_to_client();/*查看是否存在查询缓存,若存在则直接发送到客户端;*/
    yypase(); /*调用lex/yacc进行词法/语法解析,将解析结果存储到thd->lex中*/
    mysql_execute_command;/*控制优化器,通过多个switch case语句,针对不同的命令类型进行优化*/
            case:SQLCOM_SELECT:
                check_access();/*查看访问权限*/
                open_and_lock_tables;/*打开并锁定相关表*/
                query_cache_store_query();/*将该sql语句保存到查询缓存里*/
                handle_select() ;/*用于开始对union或单个select语句进入优化器的接口,函数比较短小*/

    query_cache_end_of_result();/*缓存结果*/
.................................................................................
之后,handle_select会根据查询调用:
    mysql_union();/*这种情况需要将多个select结果进行union*/
    mysql_select();/*调用优化函数*/
        join->optimize();/*进入优化器*/
        join->exec();/*进入执行器*/
            result->send_fields();/*发送查询的列标题*/
            do_select();
                sub_select();/*生成查询结果*/

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn