mysql是瑞典的mysqlAB公司开发的关系型数据库管理系统,它比较适合OLTP的应用场景,支持innodb、mylsam、mermory、archive等多种存储引擎,在各个行业有着广泛的应用。
根据上图的可以看到mysql的结构全貌,从上到下各个模块以及对应的作用如下: Connectors:数据库连接驱动,向外部提供数据库操作入口;支持多种驱动方式和多语言支持(对外门户)。 Connection Pool:mysql的连接管理采用的是线程模型(postgresql采用的是进程模型),当有一个新的客户端请求连接时,服务端会申请一个线程负责与客户端进行通信。连接线程池负责统一协调管理外部连接;进行用户权鉴、连接线程管理、连接数控制等。 SQL Interface:执行sql语句的标准接口定义,数据库范式对外的程序映射? Parser:语法解析器,负责sql语句的解析。 Optimizer:sql优化器,执行的sql语句通过解析后会进行sql优化,根据sql语义选择性能最好的执行方式对已有语句进行翻译,保障执行sql的最优性能。 caches&buffer:mysql的全局缓存,存储近期访问数据的索引以及数据。 Pluggable storage engines:存储层插件集合,存储引擎层是以插件的方式进行管理的,不同的存储引擎可以进行切换,常用的存储引擎有mylsam和innodb。
有了上述大致结构的铺垫,我们先直观看一下一个sql从客户端发送请求到数据库接受响应都经历了什么,以及在上述结构中各个模块都做了哪些事情。
1.客户端通过Connectors驱动程序发送sql请求,并由ConnectPool最先接收。ConnectPool接收后会进行一系列的连接验证,包含是否有可用的连接资源、当前用户密码是否正确,是否具备访问数据库的权限。
2.(早起版本中默认开启数据缓存功能,以sql语句为key,先通过Cache取数据,如果命中则直接返回。由于命中率比较低,后续版本中默认关闭该功能)
3.通过1中的连接验证后,sql语句进一步来到了Parser这里进行语法解析,构造对应的语法树,这里的语法树可以理解为将sql这种字符串形式转换为程序可识别的命令,日常工作中如果我们写错了sql会有对应的错误提示,就是通过这里解析识别出来的。
4.查询优化器会根据sql要做的事情进行优化,选择性能较好的方式进行执行。比如调整join语句中表的连接顺序、去除无效的条件、当表中有多个索引时决定选择哪一个等等。一般数据库的优化器包括基于成本的优化和基于规则优化,mysql采用的是基于成本低优化模式,即将每个查询的执行动作都赋予一定的权重,根据评估查询过程中各个环节所耗费的加权总和来评估性能,选择最优的方式。
5.sql语句作为查询命令通过API查询接口执行引擎读取数据。
6.最后由存储引擎负责提供数据。
|