一条 SQL 查询语句是如何执行的? – [笔记]
- MySQL 逻辑架构图 (From 丁奇-林晓斌)
- 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分
- Server 层包括连接器、分析器、优化器、执行器等,以及所有的内置函数,存储过程、触发器、视图等也在这一层实现
- 不同的存储引擎共用一个 Server 层
连接器
- 连接器负责跟客户端建立连接、获取权限、维持和管理连接。
- 可以使用
show processlist
查看系统中存在的连接,如果太长时间没有动静,连接器会自动断开,由参数 wait_timeout 控制,默认8小时- 长连接:指连接成功后,客户端如果有持续的请求,则一直使用同一个连接。
- 短连接:指每次执行完很少几次查询就断开连接,下次查询再重新建立。
长连接可能会导致内存涨得特别快,需要定期断开长连接,或者用
mysql_reset_connection
初始化连接资源
查询缓存
- 建立完连接之后,就可以执行 select 语句了
- MySQL 拿到查询请求之后,会先到缓存里面查找,如果存在,则直接命中,以键值对的方式返回值给客户端。如果不在缓存中,则执行后面的阶段,并将结果也缓存
- 只要有对一个表的更新,这个表上所有的查询缓存都会被清空,对于更新压力大的数据库,查询缓存的命中率会非常低。
MySQL 8.0 版本直接将查询缓存的功能删掉了
分析器
- 如果缓存没有命中,则开始对 SQL 语句做解析
- 分析器先做词法分析,需要识别 select 等关键字,再做语法分析,判断语句是否符合 MySQL 语法
优化器
- 经过了分析器,MySQL 就知道你要做什么了
- 优化器会决定使用哪个索引,决定各表的连接顺序,确定语句的执行方案
执行器
- 进入执行器阶段,开始执行语句
- 开始执行的时候,会检查对表的执行查询权限,如果没有,则返回无权限错误(如果命中缓存,会在查询缓存返回结果的时候,做权限验证)
- 调用 InnoDB 引擎(或其它),将所用满足条件的行或记录集返回给客户端
至此,语句就执行完毕。