sql 执行流程为:sql语句 -> 查询缓存 -> 解析器 -> 优化器 -> 执行器。
客户端程序 connectors >> 连接池 >> SQL接口 >> 解析器 >> 优化器 查询缓存 >> 插件式存储引擎 >> File(文件系统/日志文件)
1. 客户端程序 : 包括一些mysql工具如:native 或者语言工具如:php 、go 、python 2. 连接池 : 提供多个用户客户端和服务端交互的线程 3. SQL接口 : 接收sql命令,返回查询结果 4. 解析器 : 进行sql语法的解析、语意解析、生成语法树 5. 优化器 : mysql核心组件,对sql命令进行优化 6. 缓存 : 以key -> value方式缓存查询结果 (如果查询sql指令有缓存直接在SQL接口部分返回缓存结果) 7. 存储引擎 : 与底层文件惊醒交互,查询数据文件系统、日志文件等
connectors 是指在不同语言中与sql的交互。 要使用mysql 可以编写程序与mysql服务端建立tcp连接 按照定义好的mysql协议进行交互。
接下来的mysql server结构分为如下三层。
客户端访问mysql服务端前,需要建立tcp连接
经过三次握手连接成功后,mysql服务端对tcp传输的账号密码进行认证、权限获取(通过权限表获取权限写入内存)。
由于多个系统与mysql建立的连接并不止一个,所以为了结局tcp无限创建销毁TCP连接带来的资源消耗、性能下降问题。mysql服务器有专门的tcp连接池限制最大连接数,采用长连接模式复用tcp连接,来解决以上问题
服务层主要完成大多数的核心服务功能,如SQL接口,缓存查询、SQL分析以及优化部分内置函数的执行,所有的跨存储引擎功能也在这一层实现,如:存储过程、存储函数。
在该层中,服务器会解析查询并创建相应的解析树、完成对其的优化如:确定表查询的顺序,是否利用索引等,最后生成相应的执行操作。
如果是查询SELECT语句 ,服务会查询内部缓存,如果缓存空间足够大,可以解决大量读操作的环境中很好的提升系统的性能。
SQL Interface 接口
Parser:解析器
查询优化器
sql命令在解析之后、查询之前会使用查询优化器确定sql语句的执行路径,生成一个执行计划
这个执行计划表明应该使用哪些索引进行查询,表之间的顺序应该如何,最后按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将结果返回
他使用选取-投影-连接
策略查询,如:
select id,name from user where gender='女'
这个sql查询先根据where进行选取
,而不是将数据全部查询出来在进行过滤。
这个sql先根据id和name进行属性投影
,而不是将所有字段取出来在过滤
将两个条件连接
起来生成最后的结果
查询缓存组件( mysql8.0 已经优化掉该过程 )
在mysql8.0中删除该机制
。mysql的架构可以在不同场景中应用并发挥良好的作用,主要体现在存储引擎哈桑,插件式的引擎架构将查询处理和其他系统任务以及数据的存储提取分离。这种架构可以根据业务去求和实际需要选择合适的存储引擎,同时开源的mysql还允许开发人员设置自己的开发引擎。
插件式的存储引擎层,真正的负责了mysql中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过api与存储引擎通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
所有的数据、数据库、表的定义,表的数据、索引等都是存储在文件系统上以文件的形式存在,并且完雨存储引擎的交互,在文件系统下,可以使用本地磁盘,也可以使用DAS、NAS、SAN等各种存储系统。