首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >轻松搞懂MySQL的逻辑结构

轻松搞懂MySQL的逻辑结构

作者头像
一个架构师
发布2022-06-20 20:08:44
发布2022-06-20 20:08:44
6110
举报

本文旨在从select语句的解析和执行过程, 了解 MySQL的逻辑结构。

先看 select语句执行时都要经过哪些模块处理.

了解了MySQL的整体结构之后, 我们再针对各功能模块逐一说明.

1. 连接器

负责建立连接、维持和管理连接, 以及验证权限。

在你登录失败时, 经常会遇到”Access denied for user”错误, 就是连接器中的权限验证没有通过.

用户登录认证通过之后, 连接器会从权限表中查出对应的权限, 之后该连接相关的所有权限判断, 都依赖于此时读到的权限.

即使管理员账号对这个用户的权限做了修改, 也不会影响已经存在连接的权限。

连接创建成功后, 可以通过show processlist 命令查看所有连接.

如果客户端8小时(根据参数wait_timeout确定)都没有请求, 连接器会断开连接. 以免造成连接资源浪费.

2. SQL 接口

主要是接收SQL命令和返回执行结果.

在接收到 SQL 之后, 首先会到查询缓存中查看是否有缓存数据, 如果有就直接返回, 没有才会进行 SQL 解析, 执行等操作, 同时会将结果再缓存起来, 并返回用户需要查询的结果。

3. SQL 解析器

进行语法分析和词法分析, 预处理等操作.

分析要执行的 SQL 是否语法正确, 表名是否正确等.

如果遇到”You have an error in your SQL syntax”错误, 就是SQL 解析器解析错误给出的提示.

4. SQL 优化器

进行生成执行计划, 索引选择等操作.

Select语句会被解析成语法树, 并根据存储引擎特点, 表相关统计数据等信息, 进行sql重写, 读表顺序调整, 多表联合查询时的连接顺序调整, 索引选择等优化操作.

5. SQL 执行器

调用存储引擎接口, 返回结果.

6. 存储引擎

提供可插拔式的存储功能插件, 主要功能是存储数据, 提供读写接口, 如MyISAM和InnoDB.

7. 查询缓存

缓存查询结果, sql会做为缓存的 key.

查询缓存看似能提高 select效率, 但却是弊大于利的. 原因是一个表只要有更新, 那这个表上所有的查询缓存都会被清空。很可能缓存的数据还没使用, 就被清空了。

也可以修改参数query_cache_type=DEMAND, 使所有的SQL 语句都不使用查询缓存。

对需要使用查询缓存的语句, 可以用 SQL_CACHE 显式指定.

select SQL_CACHE * from t where id=10;

注意: 在 MySQL8中已经彻底删除了缓存模块, 可见官方对它的不认可了.

通过以上介绍, 脑中是不已经有了 MySQL 的轮廓了.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从码农的全世界路过 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档