MySQL 查询语句执行过程浅析

经典的一条语句:

select * from user where id=1

MySQL的大概架构是这样的。

MySQL

(网图,侵删)

连接器

而当你在程序里执行上面那条语句时,MySQL首先走到了连接器,这就类似于下面的命令。

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

这条命令相信都用过吧,这是登录数据库的命令。此时连接器会做权限验证,如果你的用户名错误,将会返回Access denied for user

如果正确,连接器会在权限表里面查出你这个账号拥有的权限,需要注意的是,之后所有的操作都将依赖此时你登入的账号。这就意味着,即使你更改了这个用户的权限,也必须等到下次登录才会生效。

我们都知道,建立连接通常是比较复杂的,所以很多时候我们都选择长连接,但是很多时候也会发现使用长连接 mysql占用的内存会越来越大。

这是因为mysql在执行过程中,临时的内存都是管理在连接对象里面的。这些资源只有在断开时才会被释放。

这种情况,可以考虑以下两种选择:

1.定期断开连接。程序里执行一个占用大内存的查询后主动断开。之后再查询要重连。

2.5.7版本之后有个mysql_reset_connection命令,意思是不需要重连和做权限验证,初始化这个连接。

2、查询缓存

连接建立完成后,就可以执行select了,mysql拿到语句后,会先到查询缓存看看 之前是不是执行过这条语句。查询缓存里面存储的是类似key-value的形式,如果有执行的话将会直接返回结果,这样的效率会大大提高。

但是!如果你表更新很频繁的话,强烈建议不使用查询缓存。因为每次更新,都将重置查询缓存。因此你还没用,就把费劲存起来的结果清空了,命中率会非常低。

需要注意,mysql8.0已经将查询缓存删除。

分析器

当MySQL发现并没有查询缓存后,继续往下执行,这时走到了分析器。

分析器,顾名思义就是分析你这条sql。首先,mysql会做“词法分析”,根据你这段sql进行拆分。例如,select是个关键字,它会拆分,mysql需要识别出里面的字符分别是什么,代表什么(这就相当于框架中的curd方法,也是做的分析)。

做完了识别后,就会进行“语法分析”,判断你这条sql是否符合语法规定,如果不符合,会返回语法错误。”

You have an error in your SQL syntax

一般咱需要关注的是”use near”后面紧跟着的内容。

优化器

如果一切得当,这时又会走到了”优化器”。“优化器”,就是会判断你这条sql里面是否有优化的地方,使用哪个索引,以及使用join时,先连哪张表效率更高

当优化器做完后,这条sql的执行方案就确定下来了,就下来就会进入执行器阶段。

执行器

执行器首先会判断你是否有对这张表的查询权限,如果没有,将会返回错误。“select command denied to user”需要注意,查询缓存返回结果前也会判断是否有权限。

如果有权限,执行器会根据表的引擎定义,去调用引擎提供的接口。

至此,这个sql就执行完成了。

本作品采用《CC 协议》,转载必须注明作者和本文链接
纯阳太极两仪四象八卦圈
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!