MySQL连接查询流程源码

来源: 互联网
版本: 不详, 仅做参考用

初始化:

点击(此处)折叠或打开

  1. main
  2.     |-mysqld
  3.         |-my_init // 初始话线程变量,互斥量
  4.         |-load_defaults // 获取配置
  5.         |-init_common_variables // 初始化变量
  6.         |-init_server_components // 初始化插件
  7.         | |-plugin_init
  8.         | | |-plugin_initialize
  9.         | |-initialize_storage_engine
  10.         |-network_init // 监听网络
  11.         |-grant_init
  12.         |-servers_init
  13.         |-udf_init

插件启动:

点击(此处)折叠或打开

  1. main
  2.     |-mysqld_main
  3.         |-init_server_components
  4.             |-plugin_init
  5.                 |-plugin_initialize
  6.                     |-ha_initialize_handlerton
  7.                         |-innobase_init

登录过程:

点击(此处)折叠或打开

  1. main
  2.     |-mysqld_main
  3.         |-network_init // 建立socket监听,一个针对网络,一个针对unix域
  4.         |-handle_connections_sockets
  5.             |-poll
  6.             |-mysql_socket_accept // 和客户端建立连接
  7.             |-create_new_thread // 针对每个socket连接建立一个新的线程
  8.                 |-create_thread_to_handle_connection
  9.                     |-waiting_thd_list->push_back(thd);mysql_cond_signal(&COND_thread_cache); // 已有连接处理线程时,通过信号唤醒,处理线程函数为pfs_spawn_thread
  10.                     |-mysql_thread_create(启动的线程执行函数,inline_mysql_thread_create)
  11.                         |-spawn_thread_v1
  12.                             |-pthread_create(pfs_spawn_thread)

处理连接:

点击(此处)折叠或打开

  1. pfs_spawn_thread
  2.     |-handle_one_connection
  3.         |-do_handle_one_connection
  4.             |-MYSQL_CALLBACK_ELSE(thread_scheduler, init_new_connection_thread, (), 0)
  5.             | |-init_new_connection_handler_thread
  6.             |-thd_prepare_connection
  7.             | |-login_connection // 判断是否可以login,不可以则断开连接返回错误
  8.             | | |-check_connection
  9.             | | | |-acl_authenticate
  10.             | | | |-do_auth_once
  11.             | | | |-native_password_authenticate
  12.             | | | |-server_mpvio_write_packet
  13.             | | | | |-send_server_handshake_packet // 发送handshake包到客户端
  14.             | | | | |-my_net_write
  15.             | | | | | |-net_write_buff // 将数据写入到内存
  16.             | | | | |-net_flush // 将内存中数据发送到网络
  17.             | | | |-server_mpvio_read_packet // 从客户端接收Login Request信息
  18.             | | | |-my_net_read
  19.             | | |-Protocol::end_statement
  20.             | | |-Protocol::send_ok
  21.             | | |-net_send_ok // 发送response ok
  22.             | | |-my_net_write
  23.             | |-prepare_new_connection_state
  24.             |-do_command
  25.                 |-dispatch_command
  26.                     |-mysql_parse

select命令:

点击(此处)折叠或打开

  1. pfs_swpawn_thread
  2.     |-handle_one_connection
  3.         |-do_handle_one_connection
  4.             |-do_command
  5.                 |-dispatch_command
  6.                     |-mysql_parse
  7.                         |-parse_sql
  8.                         | |-MYSQLparse
  9.                         |-mysql_execute_command
  10.                             |-select_precheck
  11.                             | |-check_table_access
  12.                             |-execute_sqlcom_select
  13.                             | |-open_normal_and_derived_tables
  14.                             | |-open_tables
  15.                             | | |-open_and_process_table
  16.                             | | |-open_table(THD *thd, TABLE_LIST *table_list, Open_table_context *ot_ctx)
  17.                             | | |-Table_cache::get_table
  18.                             | | |-get_table_share_with_discover
  19.                             | | | |-get_table_share
  20.                             | | | |-open_table_def
  21.                             | | |-my_malloc // 申请表数据结构
  22.                             | | |-open_table_from_share
  23.                             | | |-handler::ha_open
  24.                             | | |-ha_innobase::open
  25.                             | | |-dict_table_open_on_name
  26.                             | | |-dict_load_table
  27.                             | | |-btr_pcur_is_on_user_rec
  28.                             | | |-dict_load_table_low
  29.                             | | | |-dict_mem_table_create
  30.                             | | |-fil_space_for_table_exists_in_mem
  31.                             | | |-fil_open_single_table_tablespace // 打开表空间文件
  32.                             | |-mysql_handle_derived
  33.                             |-handle_select
  34.                                 |-mysql_select
  35.                                     |-mysql_prepare_select
  36.                                     | |-JOIN::prepare
  37.                                     |-mysql_execute_select
  38.                                         |-JOIN::exec
  39.                                             |-select_send::send_result_set_metadata
  40.                                             | |-Protocol::send_result_set_metadata
  41.                                             |-do_select
  42.                                                 |-sub_select
  43.                                                     |-evaluate_join_record
  44.                                                         |-end_send
  45.                                                             |-select_send::send_data
  46.                                                                 |-Protocol::write
时间: 2024-12-31 09:11:17

MySQL连接查询流程源码的相关文章

经典mysql连接查询例题_Mysql

 MySQL连接查询相信大家都有所了解,连接查询是在数据库查询操作的时候经常用到的,下面就为您介绍MySQL连接查询 mysql连接查询:支持多表连接 对同一张表可以重复连接多次(别名在多次连接同一张表时很重要) 例题1: 下面有2张表 teams表  比赛结果表:result 问题: 得出一张表:主队,客队,比赛成绩,比赛时间 方法一:子查询和连接查询混合   step1: 复制代码 代码如下: select result.id, t_name as h_name,match_time,res

[Android]从Launcher开始启动App流程源码分析

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5017056.html 从Launcher开始启动App流程源码分析 com.android.launcher.Launcher就是我们的Launcher页面了,可以看到Launcher其实也是一个Activity: public final class Launcher extends Activity implements View.OnClickListe

详解MySQL中的分组查询与连接查询语句_Mysql

分组查询 group bygroup by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表达式 "用来限制分组后的显示,满足条件的结果将被显示:with rollup 将会在所有记录的最后加上一条记录,该记录是上面所有记录的总和. 1)单独使用 group by 单独使用,查询结果只显示一个分组的一条记录. 实例: select * from employee group by sex;

mysql c# 代理-使用代理上网情况下c#如何连接到外网mysql进行查询

问题描述 使用代理上网情况下c#如何连接到外网mysql进行查询 开发环境:vs2010语言:c# 网络环境:使用代理上网由于公司设置不能直接上网,只能通过设置代理进行访问网络.请问c#中如何写mysql连接语句

mysql-关于MySQL的完全外连接查询

问题描述 关于MySQL的完全外连接查询 问题看下图 为毛左连接和右连接查询都可以,全外连接就不行了啊?而且命令我也是直接翻阅上面的,只是把right改成了full 解决方案 mysql 不支持full joinhttp://blog.csdn.net/whitebill2004/article/details/7570541 解决方案二: (A left join B ) union (A right join B) 解决方案三: select [列名称] from 表名称 cross joi

mysql的查询、子查询及连接查询

一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数)           1.where常用运算符:             比较运算符                 > ,  < ,=  , != (< >),>=   ,   <=                   in(v1,v2..vn)                   between v1

C#连接mysql然后查询存储过程

问题描述 C#连接mysql然后查询存储过程 C#连接mysql 然后查询一个名为userinfo的存储过程,传参5 sql:call userinfo(5); 这个是查询用户的信息的存储过程,执行这个sql,然后获得查询出来的结果,并且输出. 有没有大神写个demo我学习一下,谢谢! //正常执行sql语句我会,不会查存储过程 解决方案 C#调用mysql查询存储过程c#连接mysql 找不到存储过程mysql 树形结构查询(存储过程) 解决方案二: using System;using Sy

WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流、IPersistStreamInit接口的声明和一些相关的小方法

原文:WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流.IPersistStreamInit接口的声明和一些相关的小方法首先多谢朋友们的捧场: 今天给大家带来一个操作WebBrowser的一些高级方法,我专门写了一个html编辑器的实现代码,有需要的朋友可以自己扩充: 功能实现是直接写流到WebBrowser内不通过临时文件,并且支持对WebBrowser的一些高级控制(其实script可以达到的均可达到,想知道怎么搞的可以阅读代码). 其中关于IPersis

MySQL中基本的多表连接查询教程_Mysql

一.多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如:         由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN  2.   内连接INNER JOIN 在MySQL中把I SELECT * FROM table1 CROSS J