1.1. MySQL逻辑架构
心里记着一张MySQL组件关系图对于理解MySQL服务器有很大帮助。图1-1展示了一张MySQL架构的逻辑视图。最上面一层包含的服务不是MySQL所独有的。它是多数基于网络的客户端/服务器工具或者服务所需要的:连接处理、鉴权、安全等等。
图1-1 MySQL逻辑架构图
从第二层开始,事情才变得有趣起来。MySQL的重要组件都在这部分,包括查询的解析、分析、优化、缓存以及其他所有的内置函数(如日期函数,时间函数,数学函数以及加密函数等)。另外所有存储引擎所共有的功能也都在这一层,比如存储过程、触发器、视图等。
第三层包括了存储引擎。存储引擎负责在MySQL中存储和获取数据。如同GNU/Linux的众多文件系统一样,这些存储引擎同样有着自己的优势与缺点。服务器通过存储引擎API来与存储引擎进行交互。这个接口隐藏了各个存储引擎之间实现上的差异,并且很大程度上使得存储引擎与查询层分开。这个API包括了许许多多的底层函数来执行诸如“开始一个事务”或者“获取包括这个主键的行”等操作。存储引擎不解析SQL(有一个例外是InnoDB存储引擎中解析外键定义时还需要解析SQL,因为MySQL在查询层没有对外键进行实现。),也不和其他存储引擎进行直接交互,它们只是简单的响应服务器的请求。
1.1.1. 连接管理与安全
在服务器进程内每个客户端连接会得到一个单独的线程。这个连接的所有查询都在那个线程内执行,而这些线程轮流地驻留在CPU或者其中一个核上(多核情况)。服务器会缓存创建的线程,因此不需要为每个新的连接都创建或者销毁线程。(MySQL AB计划在未来的服务器版本中将连接与线程分开)
当客户端应用连接到服务器时,服务器需要对它进行鉴权。鉴权是基于用户名、客户端地址以及密码的。X.509的证书也可以用在基于安全套接字层(SSL)的连接之上。当一个客户端连接到服务器后,服务器会验证客户端是否有权限执行它所发出的每个查询,(比如检查用户是否有权限在world数据库上的country表上执行一个SELECT语句。)在第十二章,我们将会详细介绍这部分的内容。
1.1.2. 优化与执行
MySQL通过解析请求来生成一个内部结构体(解析树),然后在此基础上应用一系列的优化策略。这些策略可能包括重写请求,确认读取表的顺序,决定用哪些索引等等。你也可以在查询语句中添加一些特殊的关键字来影响优化器的优化策略选择。你也可以要求服务器来解释优化的各个方面。这可以使得你知道服务器在优化时所做的决定,以此为参考可以修改查询语句,数据库表定义以及设置等,以使数据库尽可能高效的运行。我们将在第四章详细介绍优化器的知识。
优化器实际上可以不关心存储引擎具体使用哪一个数据库表,但是存储引擎却可以对服务器如优化查询产生影响。优化器会向存储引擎询问它的一些能力,特定操作的代价以及表数据的统计信息。比如有些存储引擎所支持的索引类型对于特定的查询很有帮助。我们将会在第三章详细介绍索引以及数据库模式的优化。
在解析查询之前,服务器会先询问查询缓存,查询缓存中只存储SELECT语句以及它对应的结果。如果有人发出了一条和查询缓存中已经存在的SELECT语句一样的查询请求,那么服务器就不必解析、优化甚至执行-它只是简单地将已经存在的结果集返回。我们将会在“MySQL查询缓存”一节中详细对此进行描述。