MySQL层次结构
MySQL层次分为三层,如下图:
- 第一层服务负责连接处理、授权认证、安全等。
- 第二层服务包括查询解析、分析、优化、缓存以及所有内置函数,还包括所有跨存储引擎的功能(存储过程、触发器和视图等)。
- 第三层服务是存储引擎。负责MySQL中数据的存储和提取。存储引擎提供API与上层服务器通信,这些接口屏蔽了不同引擎之间的差异,对上层的查询过程透明。
大体上,也可以说MySQL层次有两层,服务层和存储引擎层。第一层和第二层归属于服务层。
SQL语句的执行
执行SQL
- 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,服务器会缓存线程,所以不需要为每一个新建的连接创建或销毁线程。
- 连接MySQL服务器时,服务器需要进行认证。认证成功后,服务器还会继续验证客户端是否具有某个特定查询的权限。
- 对于SELECT语句,服务器会先查询缓存,如果能够找到相应的结果,服务器直接返回结果给客户端。
- MySQL会解析查询,并创建内部数据结构(解析树)。
- 对解析树进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。
- 执行SQL语句。
一条SELECT语句的执行
按MySQL层次中箭头流向各个组件的顺序,执行如下:
- 连接/线程处理
客户端连接MySQL服务器,与数据库进行连接。因为连接过程比较耗时,所以服务器维护了连接线程的复用。连接时会进行身份和权限的认证。 - 查询缓存
SELECT语句会先在缓存中查询数据。如果缓存没有及时更新,可能产生查询到脏数据。 - 解析器
对SELECT语句进行解析,构建解析树。 - 优化器
此时MySQL服务器已经知道将要做什么了,优化器对要执行的过程进行优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。 - 执行
执行过程不仅调用存储引擎API,获取和返回最终的结果,可能还包括获取和释放锁,验证用户执行权限等操作。在开始执行前,还有验证用户是否具有相应的查询权限,如果没有返回权限错误。如果具有执行权限,打开数据表,调用存储引擎提供的API接口执行SELECT查询操作。最终将所有满足条件的行记录作为结果集返回给客户端。