MYSQL优化(一):【架构解析、sql语句执行详细流程】

来源:互联网 发布:云计算厂商 编辑:程序博客网 时间:2024/05/16 05:12

mysql架构:
特点:基于C/S架构、基于线程工作、mysql是一个独立的进程
这里写图片描述
客户端:连接到服务器上,并将请求发送到服务器;
服务器端:
1、连接/线程处理
2、查询缓存
3、分析器
4、优化器
5、存储引擎

**服务器这样分:
第一层(1):并不是Mysql独有,大多数基于网络客户端、服务器工具,例如:连接处理、授权认证、安全等
第二层(2、3、4):核心服务层,包括查询解析、分析、优化、缓存、内置函数,所有跨域存储引擎的功能都在这一层实现:存储过程、触发器、视图
第三层(5):包含存储引擎,负责Mysql数据的存储和提取。**

第一层:
连接线程处理/连接管理:每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU中运行,服务器会负责缓存线程(例如,使用线程池,可以使用线程池中少量的线程来服务大量的连接),因此,不需要为每一个新建的连接创建和销毁线程。
安全性:当客户端连接到mysql服务器时,服务器需要对其进行认证。认证基于用户名,原始主机信息和密码。如果使用了安全套接字(SSL)的方式连接,还可以使用X.509证书认证。一旦客户端连接成功,服务器会继续验证该客户端是否具有执行某个特定查询的权限。
综上所述:用户发起请求 连接/线程处理器 开辟内存空间 开始提供查询的机制
第二层:
优化与执行:MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括,重写查询,决定表的读取顺序,以及选择合适的索引等。同时,用户也可以通过特殊的关键字提示优化器,影响它的决策过程。可以请求优化器解释(explain)优化过程的各个因素,使用户可以知道服务器是如何进行优化决策的,并提供一个参考基准,便于用户重构查询和schema,修改相关配置,使应用尽可能高效运行。
优化器不关心表使用的是什么存储引擎,但存储引擎对于优化查询时有影响的。优化器会请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息等。
对于SELECT语句,在解析查询之前,服务器会先检查查询缓存(Query Cache),如果能够在其中找到对应的查询,服务器就不必再执行查询解析,优化和执行的整个过程,而是直接返回查询缓存中的结果集。
第三层:
包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。和GNU/Linux下的各种文件系统一样,每个存储引擎都有它的优势和劣势。服务器通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异,使得对上层透明。通常存储引擎不会去解析SQL(InnoDB会解析外键定义),不同存储引擎之间也不会相互通信,而只是简单地响应上层服务器的请求。

运行流程:
1>连接:
客户端发起一条Query请求,监听客户端的“连接管理模块”接受请求
—>将请求转发到“连接进/线程模块”
—>调用“用户模块”进行授权检查
—>“连接进/线程模块”从“线程连接池”中取空闲的连接线程和客户端请求对接,如果失败就创建一个新的连接请求(用于响应客户端请求用户发起的查询请求都在线程空间内运行, 结果也在这里面缓存并返回给服务器端,线程的重用和销毁 都是由连接/线程处理管理器实现的);
2>处理:
查询缓存空间,先检查Query语句是否完全匹配,然后去检查是否有权限,如果Query匹配,也有权限就直接将数据返回,如果Query不匹配则继续走,如果是无权限,则直接将状态标识修改,并返回结果
—>交给命令解析器,词法分析,语法分析后生成解析树
—>预处理阶段:处理解析器无法解决的语义,检查权限等(如果权限不足,则直接修改状态标识,返回结果),生成新的解析树
—>再交给对应的模块处理
—>如果是select查询,还会经过“查询优化器”做大量的优化,生成执行计划;
—>模块收到请求后,通过“访问控制模块”检查所连接的用户是否有访问目标表和目标字段的权限
—>有则调用“表管理模块”,先检查table catch中是否存在该表,如果存在就直接访问目标并获取锁,否则重新打开表文件
—>根据表的meta数据,获取表的存储引擎类型等信息,通过接口条用对应的存储引擎处理
—>上述过程中产生数据变化的时候,如果打开日志功能,则会记录到相应的二进制日志文件中;
3)结果返回:
Query请求完成后,将结果集返回给“连接进/线程模块”
—>返回的也可能是相应的状态标识,如成功或者失败等
—>“连接进/线程模块”进行后续的清理工作,并继续等待请求或断开与客户端的连接
这里写图片描述
图片来自网络
【以上图片均来自网络,如有侵权,麻烦告知删除】

原创粉丝点击