文章目录
- 前言
- 一、MySQL数据库的组成
- 二、SQL执行过程
- 1.连接器
- 2.查询缓存
- 3.分析器
- 4.优化器
- 5.执行器
前言
本文是基于MySQL实战45讲的一篇笔记文
先给出执行草图
提示:以下是本篇文章正文内容,下面案例可供参考
一、MySQL数据库的组成
大体上MySQL数据库可以划分为两部分组成,服务层和存储引擎,常用的存储引擎为innoDB和MYISAM.
而服务层又可以细分为连接器,缓存器和缓冲, 分析器,优化器,执行器.
二、SQL执行过程
1.连接器
连接方式我们知道,各种编程语言、远程连接本地连接的表现方式都不同,对于Java,提供了一个专门用于连接MySQL数据库的JDBC. 连接器当然也是外界接触到MySQL的第一层,类似于MVC架构中的controller层
由于连接过程相对复杂,因此推荐使用长连接的方式连接数据库, 然而长时间地连接数据库可能会造成内存增长过快的情况, 这是由于MySQL运行过程中临时使用的内存是管理在连接对象中的,如果内存过大可能会被系统杀死,造成MySQL异常重启
如何解决长时间连接造成的异常重启问题呢? 可以在连接一段时间后重新连接MySQL
2.查询缓存
首先需要说明的是查询缓存的命中率较低,原因在于如果对目标表做了更新操作,之前所有查询所留下的缓存均会被清空, 因此对于需要频繁更新数据的表来说是查询缓存的命中率会极低.
当然在8.0版本之后,查询缓存功能已被砍掉.
3.分析器
分析器主要用于词法分析与语法检查. 如果查询的字段不存在于该表中, 报错也是产生在该阶段的
4.优化器
优化器(optimizer)用于优化SQL语句中各部分执行的先后顺序, 或者是当存在多个索引时,决定使用哪一个索引.
当然, 优化器最后产生的优化结果并不一定就是我们想要的结果, 只是MySQL认为的最优解.
同时优化器也是可插拔的,在遇到极端需求时可以手写一个优化器.
5.执行器
执行器在执行SQL之前, 会对用户的权限进行判断, 如不具备查询权限,会返回无权限的错误
在做查询时,系统是对数据库表一行一行地进行查询,慢查询日志中的rows_examined字段用于记录查询到结果时,扫描了多少行记录