原文链接:当执行一条 select 语句时,MySQL 到底做了啥?
也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务。
就算重启成功了,对于问题的原因仍不知所以。
本文开始,记录学习《MySQL实战45讲》专栏的过程。
也许有人会问,你记录有什么意义?直接看专栏不就行了吗?你这不是啃别人的剩骨头吗?
是的,这个系列,我只是基于专栏学习,但是我会尽量从我的角度搞懂每一个知识点,遇到不懂得也会将知识点进行拆分。
我知道关注公众号的小伙伴也有很多购买了这个专栏的,我希望大家都能够利用好这个机会,把 MySQL 吃透!
看大家的反馈情况吧,若有需要,可以建个小群,大家互相讨论学习!
下面开始正文。
大家或多或少都用过 MySQL,起码 select 还是会用的吧,但是 select 执行后,MySQL 内部到底发生了什么,你知道吗?
比如,我们有个简单的表 T,它有个 ID 字段,那么我们可以执行下面的语句:
mysql> select * from T where ID=10;
语句执行很简单,但是具体到 MySQL 内部,其实是一个完整的执行流程。
MySQL 的基本架构
从下图就可以清楚地看出 MySQL 的命令执行流程:
从该图可以看出,MySQL 主要分为 server 层和存储引擎层。
- server 层中包含连接器,查询缓存,分析器,优化器,执行器,大多数核心功能以及内置函数,存储过程,触发器,视图等。
- 存储引擎层主要负责最终数据的存储和提取,例如常用的存储引擎 InnoDB、MyISAM 等。
好了,下面开始梳理一次完整的查询流程。
1 连接
首先通过连接器连接到数据库。
连接器的主要作用是建立连接,获取用户权限,维持连接,管理连接。
连接的一般命令就是我们常用的登陆数据库的命令:
mysql -u$username -h$host -p$port -P
命令执行后,若用户名或者密码不对,或者数据库做了登录 ip 限制,都会收到异常信息。
若登陆成功,那么就代表连接成功建立。
之后连接器会维持当前连接,接下来连接器会查询出该用户的权限,后面所