Mysql.5.5
#THD : thread handle
1.mysqld.cc mysql 启动服务的类
# main() -4295 调用以下方法
- init_common_variables()
- init_server_components():
- init_ssl()
- network_init()
- start_signal_handler() 创建pid 文件
- mysql_rm_tmp_tables() 删除 临时表 文件
- acl_init() 初始化访问控制列表
- servers_init() 初始化 servers 缓存,从servers表中读取,放入到缓存中
- init_status_vars()
- init_slave() 初始化从节点
- execute_ddl_log_recovery() 执行DDL 恢复服务器
- create_shutdown_thread()
- start_handle_manager()
- handle_connections_sockets() ****
- clean_up(1)
- clean_up_mutexes()
- my_end()
# init_server_components():
-- table_cache_init 初始化表缓存
-- table_def_init 初始化表定义缓存
-- hostname_cache_init 初始化 hostname 缓存
-- query_cache_result_size_limit 设置查询缓存返回的数据量大小限制
-- query_cache_set_min_res_unit 设置查询缓存递增最小单元
-- query_cache_init 初始化查询缓存,根据参数标记设置是否开启查询缓存
-- query_cache_resize 重置查询缓存大小
-- init_slave_list 初始化 从服务器 的hash 表
-- xid_cache_init XA 事务ID缓存
-- 初始化binlog ,如果开启主从复制功能
-- process_key_caches 初始化 key cache
-- ha_init() 初始化变量,事务、savepoint
-- 初始化 存储引擎
-- 初始化 事务日志
-- ha_recover() 恢复数据操作
-- ft_init_stopwords() 停用词
-- init_max_user_conn(); 最大连接数
-- init_update_queries(); 初始化 SQL命名标识符,在接收到SQL命令时,检查是否支持
# handle_connections_sockets()
调用:
- create_new_thread() 创建一个线程,处理一个连接,并将该thread handler 放入到调度器的队列中
关键代码:thread_scheduler.add_connection(thd); 实际调用了 create_thread_to_handle_connection
# create_thread_to_handle_connection()
------------------------------------------------------------
if ((error=pthread_create(&thd->real_id,&connection_attrib,
handle_one_connection, 调用处理连接的函数sql_connect.cc
(void*) thd)))
------------------------------------------------------------
调用:
- handle_one_connection() 启动一个线程处理请求
# init_common_variables() 初始化变量
调用:
- 创建 rpl_filter 复制过滤器,binlog_filter log 过滤器
- init_thread_environment() 初始化 锁,条件变量
- mysql_init_variables() 初始化一堆的变量
- mysql_bin_log.init_pthread_objects() 初始化 日志文件 锁|条件变量
- 初始化 .pid 文件
- add_status_vars() 初始化 状态 数组,SHOW STATUS 将输出该数组中的状态值
- mysqld\get_options()
# get_options()
调用:
- handle_options() 检查 参数选项
- 根据 system_variables 初始化 一堆的全局变量
- one_thread_per_connection_scheduler() 创建 线程调度器
2.sql\sql_connect.cc 处理客户端连接
# handle_one_connection() 线程处理 一个连接,接收客户端请求,处理命令
调用:
- setup_connection_thread_globals()
- prepare_new_connection_state
- do_command()
# prepare_new_connection_state() 初始化 THD 来处理 queries
# init_max_user_conn()
3.sql\sql_parse.cc 解析SQL类
# init_update_queries 初始化 sql_command_flags
# do_command()
调用:
- dispatch_command() 分发执行SQL命令,这是最牛逼的方法了
4.sql\scheduler.cc
# one_thread_per_connection_scheduler() 初始化一个线程调度器,一个线程处理一个连接请求,5.6 增加了线程池
--------------------------------------------------------------------
void one_thread_per_connection_scheduler(scheduler_functions* func)
{
func->max_threads= max_connections;
func->add_connection= create_thread_to_handle_connection; 初始化 添加 thd 方法 ,指向 mysqld::create_thread_to_handle_connection 函数
func->end_thread= one_thread_per_connection_end;
}
--------------------------------------------------------------------
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。