本文已参与「新人创作礼」活动,一起开启掘金创作之路。
MySQL的基本架构
MySQL可以分为Server层和存储引擎层两部分。
- Server层包括连接器(负责建立、维持和管理连接)、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现
- 存储引擎层负责数据的存储和提取。
首先,我们来看看一条查询语句的执行周期。
1.连接器
- 连接由TCP建立,建立后所有权限判断都依赖于此时读到的权限
- 如果一个连接长时间空闲,默认8小时后就断开连接(由参数wait_timeout控制)
- 数据库里面分为长连接和短连接,频繁建立连接会耗费资源,但也不要全部使用长连接,会导致MySQL占用内存过多(导致被系统强行杀掉),因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。
2.查询缓存
执行语句之前,会判断是否缓存了该条数据
查询缓存的实用性和命中率都很低,原因如下:
- 每次查询不一样,会额外增加开销
- 需要前后两条 SQL 完全一样才能使用
- 只要表发生更新(增删改),就会清空这张表的查询缓存
- 注:MySQL8.0后删除了查询缓存功能
3. 分析优化
紧接着,Service层会对所执行的SQL语句进行词法分析和语法分析,接着进行优化(索引、多表连接方面)
4. 执行
终于进入了执行器阶段,开始执行语句。
- 判断是否具有操作权限,如果有权限,就打开表继续执行。
- 执行器就会根据表的引擎定义,去使用这个引擎提供的接口
- 执行器调用引擎接口对这个表的数据逐行分析,最终放入到一个结果集中返回给客户端
注:
serve 层在拿到SQL语句查询的结果之后,其实是先将其发送到一个缓冲区,待到该缓冲区满了,才向客户端发送真正的结果集,该缓冲区大小由系统变量net_buffer_Iength控制