一条SQL查询语句是如何执行的
点击勘误issues (opens new window),哪吒感谢大家的阅读
# 一条SQL查询语句是如何执行的
SQL 语句在 MySQL 的各个功能模块中的执行过程。
客户端->连接器(管理连接,权限验证)->查询缓存(命中缓存直接返回结果)->分析器(词法分析,语法分析)->优化器(生成执行计划)->执行器(调用存储引擎的接口)->返回结果
存储引擎-> InnoDB, MyISAM, Memory, CSV, Archive(存储数据,提供读写接口)
# MySQL 的逻辑架构 = 餐厅点餐系统
MySQL 可以分为两层:Server 层和存储引擎层。
Server 层:像餐厅的前台和服务员
连接器:就像餐厅的门卫或前台接待,你来了之后,他们会核实你是不是会员(检查用户名和密码)。如果验证通过,接待会给你安排座位(建立连接)。
比如,来了个 VIP 客人(根用户),连接器快速确认身份并热情接待。
查询缓存:服务员会先问厨房:“这道菜是不是之前做过?有现成的吗?”(查询缓存)。
如果有,那就直接把现成的菜端上来(命中缓存);如果没有,就让厨房重新做菜(走后续流程)。
分析器:服务员拿到你写的菜单(SQL 语句),需要先理解你写的是什么内容(解析语法和单词)。
如果你菜单上写的是“白菜炒肉”(SQL 语句格式正确),那服务员能顺利理解;但如果你写的是“炒白菜肉”(SQL 错误),服务员就会提醒你修改。
优化器:厨师长会决定菜怎么做最省时间、最有效率(查询优化器)。比如,同样是炒肉,可以先切菜再炒,或者先炒肉后加菜,看哪种更快。
如果点的是“从表里找一条最贵的菜”,优化器会先找索引帮忙,而不是从头到尾挨个翻菜单。
执行器:服务员根据最终确定的菜单去通知厨房制作,并确保整个过程都顺利进行(执行 SQL 语句)。
服务员在执行过程中,可能会遇到厨房原材料不足、火候不够的问题(权限不足或表不存在),都会及时反馈给你。
# 存储引擎层:像餐厅的厨房
存储引擎:厨房决定怎么储存食材、怎么做菜。MySQL 的存储引擎是“插件式的”,就像餐厅可以选择中餐、日料、法餐不同的厨师团队来做菜。
- InnoDB:中餐大厨,擅长用高效的锅炒菜(支持事务、高并发),也是餐厅的默认大厨。
- Memory:快餐团队,直接用现成的冷藏食材做(数据存储在内存中,速度快但易丢失)。
- MyISAM:传统厨师,适合简单的家常菜(不支持事务,但查询速度快)。
当服务员把点菜单递给厨房时,厨房(存储引擎)负责根据食材准备情况去做菜(存取数据)。
# 例子:建表时选择不同的存储引擎
假如你来餐厅点了“烧鹅饭”,我们可以类比一下:
- 如果你没指定厨师(存储引擎),餐厅会默认找中餐大厨(InnoDB)来做这道菜。
- 如果你明确要求“烧鹅饭用快餐模式”(Memory 引擎),服务员会把请求交给快餐团队,但他们只能用现成的冷冻烧鹅。
- 如果你说“我要传统方式的烧鹅饭”(MyISAM 引擎),那么老派厨师会慢悠悠地做,且过程中不支持加单(不支持事务)。
# 总结 MySQL 逻辑架构图
Server 层(服务员和前台)负责协调和服务,主要包括:
- 连接器:核实客人身份并安排座位。
- 查询缓存:检查厨房有没有现成的菜。
- 分析器:理解菜单内容。
- 优化器:确定最优的做菜流程。
- 执行器:确保厨房顺利完成任务。
存储引擎层(厨房)负责存储和加工数据,根据不同的需求选择不同的厨师团队(InnoDB、MyISAM、Memory 等)。