上来先看Mysql架构图(摘自《MySQL技术内幕 InnoDB存储引擎》)。Mysql主要包括以下组件:
- 连接器 Connectors
- 系统管理&控制工具
- 连接池
- Sql接口
- Sql解释器
- Sql优化器
- 缓存池
- 存储引擎
- 文件系统
接下来介绍一下每个组件的简要功能,由于每个组件都可以展开讲很多,这篇文章只会对组件做一个简要的描述,有一个简单的概念。
连接器(Connectors)
Connectors组件是Mysql向外提供的交互组件,支持多种语言与Mysql的交互,如java, .net, php等。
系统管理&控制工具(Management Service & Utilities)
提供对Mysql的集成管理,如备份与恢复、安全管理、集群、配置等。
连接池(Connection Pool)
负责监听对客户端向Mysql Server端的各种请求,接收请求,转发请求到目标模块。Mysql会为每个成功连接Mysql Server的客户端创建或分配一个线程,该线程负责客户端与Mysql Server端的通信,接收客户端发送的命令,传递服务端的结果信息等。
想必大家都听说过数据库连接数过多,就是会导致连接池不够用,造成拒绝。
查看及设置最大连接数:show variables like '%max_connections%'; set GLOBAL max_connections=500; //重启后失效
通过配置文件修改最大连接数:my.conf ->
max_connections=512
连接数不能过大,因为Mysql会为每个连接提供连接缓冲区。
SQL接口(SQL Interface)
接受用户的sql命令,如DML、DDL、存储过程等,并且返回用户需要查询的结果。
SQL解释器(Parser)
分析SQL命令语法的合法性,并尝试将sql命令分解成数据结构,若解析失败,则提示SQL语句不合法。主要功能是将sql语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
SQL优化器(Optimizer)
查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询
缓冲池(Caches & Buffers)
查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。通过LRU算法将数据的冷端溢出,未来得及刷新到磁盘的数据页,叫脏页。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。
存储引擎(Pluggable Storage Engines)
插件式存储引擎。提供各种存储引擎,真正的负责MySQL中数据的存储和提取。
Mysql支持的存储引擎:InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。其中BDB和InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
存储系统
数据存储层,主要是将数据存储到设备的文件系统中,并完成与存储引擎的交互。
SQL的执行流程
数据库通常不会被单独使用,而是由其它编程语言通过SQL支持接口调用MySQL。由MySQL处理并返回执行结果。
- 编程语言通过SQL支持接口调用MySQL,
- MySQL收到请求后,会将该请求暂时放在连接池,并由管理服务与工具进行管理。
- 当该请求从等待队列进入到处理队列时,管理器会将该请求传给SQL接口,SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的数据进行对比,如果匹配则通过缓存直接返回处理结果;否则,去文件系统查询
- 由SQL接口传给后面的解析器,解析器会判断SQL语句是否正确,若正确则将其转化为数据结构。
- 解析器处理完毕后,便将处理后的请求传给优化器控制器,它会产生多种执行计划,最终数据库会选择最优的方案去执行。
- 确定最优执行计划后,SQL语句交由存储引擎处理,存储引擎将会到文件系统中取得相应的数据,并原路返回。