一条SQL查询语句是如何执行的?

MySQL的主要组成

MySQL逻辑框架图

MySQL 可以分为 Server 层和存储引擎层两部分。

  • Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程触发器视图等。

  • 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB( MySQL 5.5.5 版本始成为了默认存储引擎)、MyISAM、 Memory 等多个存储引擎。

Server层

连接器

mysql -h$ip -P$port -u$user -p

  • 客户端建立连接:在完成经典的 TCP 握手后, 连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码
  • 获取权限
  • 维持和管理连接

长连接:指连接成功后,如果客户端持续有请求,则一直使用同一个连接。(尽量使用)

端连接:指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

全部使用长连接后导致 MySQL 占用内存涨得特别快的解决方案:

  • 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后, 断开连接,之后要查询再重连。
  • 每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。(MySQL 5.7 或更新版本)

查询缓存(不建议用,MySQL 8.0 版本直接将查询缓存的整块功能删掉了)

之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。

  • key 是查询的语句
  • value 是查询的结果

弊大于利:对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非业务就是有一张静态表。

分析器

  • 词法分析:关键字、表名、列名
  • 语法分析:

优化器

  • 在表里面有多个索引的时候,决定使用哪个索引
  • 在一个语句有多表关联 (join)的时候,决定各个表的连接顺序

执行器

  • 先判断一下对这个表 T 有没有执行查询的权限
  • 调用引擎的接口返回数据

存储引擎层


Q:如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?

A:

分析器:包括解析器和预处理器。

解析器处理语法和解析查询, 生成一棵对应的解析树。

预处理器进一步检查解析树的合法。比如: 数据表和数据列是否存在, 别名是否有歧义等。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇