一、连接协议支持
mysql支持4种通信协议:TCP/IP协议、Unix Socket协议、Share Memory协议、NT管道
windows支持三种连接方式:TCP/IP协议、Share Memory协议、NT管道
unix支持两种连接方式:TCP/IP协议、Unix Socket协议
协议介绍如下:
1.TCP/IP协议
> 传输控制协议(Transmission
Control Protocol)/互联网协议(Internet
Protocol),是一套被用于连接互联网上各主机的通信协议。TCP/IP一开始是用于UNIX操作系统建立互联网通信的。现在它已经成为了一种网络数据传输的事实标准。即便那些拥有自己通信协议的网络操作系统,如Netware也支持TCP/IP协议。
2. Unix Socket协议
> 在计算机世界,一个socket是一种内部进程通信形式,它被用于在相同主机上形成进程间的双向通信连接点(在本地系统上的一个物理文件)。
3. Share Memory协议
> 一个在程序间传送数据的有效方法。一个程序会建立一个内存区以提供其它受允许的进程进行访问。Windows显式”passive”连接模式仅可工作于(Windows系统)主机中。
4. NT管道
>这种命名管道设计更偏向于客户端-服务器通信,它们更像socket:除了用于通常的读写操作外,Windows命名管道也同时对server应用支持显式”passive”被动连接模式。仅在单独(Windows平台)主机中运行。
二、连接管理 ----没考虑到线程池
1.命名管道连接处理线程
handle_connections_namedpipes()
2.共享内存连接处理线程
handle_connections_shared_memory
3.socket连接处理线程 -unix socket和tcp/ip都在其中实现
handle_connections_sockets_thread
4.连接完成后,创建线程,加入全局线程调度,并进行连接处理,涉及以下函数
create_new_thread(thd);
add_global_thread(thd);
create_thread_to_handle_connection(thd);
三、连接处理
主要在create_thread_to_handle_connection()函数中,主要有两个步骤
1.查看有没有缓存线程可用,如果有,就唤醒线程去处理该请求
2.如果没有缓存线程可用,则创建新线程处理该请求
之后主要赚以下操作:
1.权限认证
在thd_prepare_connection()函数中,做了host、用户名、密码等安全认知
2.等待数据接收
在以下循环中做了数据读取,指令分发功能
while (thd_is_connection_alive(thd)){mysql_audit_release(thd);if (do_command(thd))break;}
可以执行的指令主要包括一下指令:
COM_SLEEP,
COM_QUIT,
COM_INIT_DB,
COM_QUERY,
COM_FIELD_LIST,
COM_CREATE_DB,
COM_DROP_DB,
COM_REFRESH,
COM_SHUTDOWN,
COM_STATISTICS,
COM_PROCESS_INFO,
COM_CONNECT,
COM_PROCESS_KILL,
COM_DEBUG,
COM_PING,
COM_TIME,
COM_DELAYED_INSERT,
COM_CHANGE_USER,
COM_BINLOG_DUMP,
COM_TABLE_DUMP,
COM_CONNECT_OUT,
COM_REGISTER_SLAVE,
COM_STMT_PREPARE,
COM_STMT_EXECUTE,
COM_STMT_SEND_LONG_DATA,
COM_STMT_CLOSE,
COM_STMT_RESET,
COM_SET_OPTION,
COM_STMT_FETCH,
COM_DAEMON,
COM_BINLOG_DUMP_GTID,
COM_END
因为不同指令功能较多,下面将以select语句作为流程介绍