小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
MySQL整体逻辑架构
第一层 连接层
都是服务于C/S程序或者是这些程序所需要的:连接处理,身份验证,安全性等
第二层 服务层
通常叫做SQL Layer。在MySQL数据库系统处理底层数据之前的工作都是在这一层完成;包含权限判断,sql解析,行计划优化,缓存处理以及内置函数等。
- SQL接口:接收用户的sql命令,并且返回用户需要查询的结果
- 解析器:SQL命令传递到解析器的时候会被解析器验证和解析
- 查询优化器:sql语句在查询之前会使用查询优化器对查询进行优化,比如有where条件时,优化器来决定先投影还是先过滤
- 查询缓存:如果查询缓存有命中的结果,查询语句就可以直接取查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。例如表缓存,记录缓存,key缓存,权限缓存等
第三层 存储引擎层
存储引擎层,也就是底层数据存取操作实现部分,由多种存储引擎组成。它们负责存储和获取所有存储在MYSQL中的数据。
第四层 存储层
数据存储层,用于将数据运行在裸设备的文件系统之上,并完成与存储引擎的交互。
连接管理和安全
在服务器内部,每个client连接都有自己的线程。这个连接的查询都在一个单独的线程中执行。这些线程轮流运行在某一个CPU内核(多核CPU)或者CPU中。服务器缓存了线程,因此不需要为每个client连接单独创建和销毁线程 。当clients(也就是应用程序)连接到了MySQL服务器。服务器需要对它进行认证(Authenticate)。认证是基于用户名,主机,以及密码。对于使用了SSL(安全套接字层)的连接,还使用了X.509证书。clients一连接上,服务器就验证它的权限 (如是否允许客户端可以查询world数据库下的Country表的数据)。
优化和执行
MySQL会解析查询,并创建了一个内部数据结构(解析树)。然后对其进行各种优化。这些优化包括了,查询语句的重写,读表的顺序,索引的选择等等。用户可以通过查询语句的关键词传递给优化器以便提示使用哪种优化方式,这样即影响了优化器的优化方式。另外,用户也可以请求服务器给出优化过程的各种说明,以获知服务器的优化策略,为用户提供了参数基准,以便用户可以重写查询,架构和修改相关服务器配置,便于mysql更高效的运行。优化器并是不关心表使用了哪种存储引擎,但是存储引擎对服务器优化查询的方式是有影响的。优化器需要知道存储引擎的一些特性:具体操作的性能和开销方面的信息,以及表内数据的统计信息。例如,存储引擎支持哪些索引类型,这对于查询是非常有用的。在解析查询之前,要查询缓存,这个缓存只能保存查询信息以及结果数据。如果请求一个查询在缓存 中存在,就不需要解析,优化和执行查询了。直接返回缓存中所存放的这个查询的结果。
MYSQL查询执行流程
- 客户端发送一条查询给服务器;
- 服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段;
- 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划;
- MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询;
- 将结果返回给客户端。