一直对这部分不太了解,稍微看了一下,但由于知识储备有限,错误在所难免。
总的看起来MySQL在这部分依旧使用了常规的 reactor+线程池 高并发网络模型,这里我们以poll为列,有如下特点:
貌似看起来大佬的手法都是通用的,都是按照一定模式写出来的。当然实际上涉及的东西还是非常多,但是这里我们仅仅了解网络框架部分,对于线程池\vio通信模块\net协议模块不做讨论,因为我也不了解,这里主要看看网络框架。
对于用户会话线程通常叫做thread_one_connection,接着会调用thd_prepare_connection->login_connection将准备对连接fd进行ppoll的超时参数设置为connect_timeout指定的值,也就是言外之意connect_timeout是在处理连接请求的时候生效的参数。
然后thd_prepare_connection->login_connection->check_connection,在函数check_connection中完成主要任务是:
在login_connection的末尾会将连接fd的ppoll的timeout参数设置为read_timeout/write_timeout。
最后接下来就是进行命令处理的环节了。也就是do_command。通常我们的会话就堵塞在这里等待客户端命令的到来如下:
mysql底层架构分为:1、client(客户端)
2、server(服务端)
client: 主要有各种plugin、jdbc等
server: 包含了连接器、查询缓存、分析器、优化器、执行器、存储引擎
连接器 的主要作用是与 客户端 建立联系,管理客户端的连接、会话、权限验证等。
查询缓存 的作用是,在sql通过连接器之后到达服务端之后,如果sql是sel开头的语句,那么先在 查询缓存 中获取命中结果,如果有命中结果则直接返回结果。没有结果那么sql会通往 分析器 。
分析器 拿到sql后,会对sql进行词法、语法分析,同时创建sql Id,如果sql有错误,那么将会终止sql行为,将异常返回客户端。
优化器 的作用主要是对通过 分析器 的sql进行优化,比如进行 索引选择 、 重写查询 等,同时会创建 sql执行计划 ,可以通过 explain 指令进行查看。
执行器 拿到了经过优化器的sql,将会 *** 作 存储引擎 ,通过调用 存储引擎 提供的读写接口,得到返回结果。
存储引擎 是sql的最终执行者,它对外提供了读写接口,本身主要作用为执行sql、存储数据、获取数据等, 存储引擎 的设计是插件形式实现的,常见了有 InnoDB 、 MyISAM 等。
未完待续......
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)