MySQL 如何执行一条 SQL 语句的

流程示意图

示意图

连接器

连接到数据库 , 连接器负责跟客户建立连接 , 获取权限 , 维持和管理连接 .

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

长连接 : 连接成功后 , 如果客户端持续有请求 , 则一直使用同一个连接 .
短连接 : 每次执行完很少的几次查询后就断开连接 , 下次需要的时候再重新建立连接 .
建立连接的过程通常比较复杂 , 在日常使用中建议使用长连接 . 但是全部使用长连接后 , 可能会导致 MySQL 占用内存过高 , 被系统强行杀掉 , 导致 MySQL 异常重启 .
解决方案 : 1.定期断开长连接 . 2.在每次执行一个比较大的操作后 , 通过执行 mysql_reset_connection 来初始化连接资源 , 这个过程不需要重新连接和权限验证 .

查询缓存

缓存失效频繁 , 只要有一个更新 , 该表上的所有缓存将全部被清空 . 建议不使用 .
需要注意的一点是 , 查询缓存在 MySQL 8.0 中被移除了 .

分析器

词法分析 , 判断 SQL 是否满足 MySQL 的语法要求 , 识别表名和字段 , 并判断字段是否存在等 .
语法分析 , 判断语法是存在错误 , 如 SELECT 拼成 SELEC , 少了 T 字符串 , 报错 ‘You have an error in your SQL syntax’ .

优化器

在执行 SQL 语句之前优化处理 , 当表中有多个索引时 , 优化器会决定使用哪个索引 ; 在关联语句中决定表的连接顺序 .

执行器

MySQL 通过分析器知道了你要做什么 , 通过优化器知道了该怎么做 , 于是进入执行器 , 开始执行语句 .
开始执行的时候 , 需要先判断用户对这个表有没有查询或者更新/插入的权限 , 如果有权限 , 就打开表继续执行 , 打开表的时候 , 执行器会根据表定义的引擎 , 去使用这个引擎提供的接口 .