MySQL45讲之第一讲:一条SQL查询语句是怎么执行的?
分析一下MySQL执行语句的过程,口诀:大体分两顿,业务和存储,如果再细分,一连,二分,三优,四执行,查询储存看版本。
mysql> select * from T where ID=10;
大体分两顿,业务和储存
-
业务层:也叫Server层,细分中说的一连,二分,三优,四执行,查询储存看版本,都是Service层中的部件,需要注意的是存储引擎们都共用一个Server层。
-
存储层:支持MyISAM、InnoDB和Memory存储引擎,最常用的是InnoDB,MySQL 5.5.5版本之后是默认存储引擎,执行create table建表的时候可以通过*engine=?*指定存储引擎,不指定默认就是InnoDB。不同存储引擎的存储方式和功能都不一样。
(题外话:MyISAM、InnoDB两种存储引擎的区别是面试官比较喜欢提问的问题)
一连:连接器
连接时需要输入的命令是:
mysql> -h(后面接ip地址) -P(后面接端口) -u(后面接用户) -p
该命令行不建议在-p后面直接加密码这种方式连接,有可能会泄露密码,等命令提示符出现Password再输入。
连接的过程是TCP进行连接,一旦连接之后,开始验证身份,账号密码均通过之后,就会对连接的人进行一个权限的判定,权限一经判
定,则直到连接结束之后都不会改变,即使使用管理员进行权限修改也是。
长连接和短连接
- 长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。
- 短连接 则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
(题外话:MySQL默认端口是3306,我自己在搭建个人博客的时候,同行跟我说不要乱开3306端口,如果开了,如果你的MySQL数据库
又密码设置得又非常简单,那么有可能会被一下人给洗劫哈哈。)
二分:分析器
原作者说了很多,我只想用一句话概括,分析器的作用类似于使用编程语言的时候的编译功能,判断语法和变量是否遵守规则,让
MySQL知道你要干什么。
三优:优化器
优化器,顾名思义是优化整个执行过程效率的,一般作用在选择索引或者表连接(join)顺序的时候。
四执行:执行器
到了执行器这一阶段,根据语句,首先判断你有没有T表的访问权限。
mysql> select * from T where ID=10;
有权限则执行以下过程:
- 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;
- 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
- 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
查询缓存看版本
查询缓存看版本,MySQL8.0之后,就已经把查询缓存这个功能删除了。
查询缓存其实是在“二分”,也就是分析器之前,但是原作者建议不使用缓存,因为涉及到缓存表的更新,频繁更新的数据表使用缓存,命
中率低,往往会耗费大量资源增加数据库压力。当且仅当业务表长期不更新才适用于使用缓存功能。
小结
- 认识了一条SQL查询语句大体的执行流程。
- 口诀:大体分两顿,业务和存储,业务,一连,二分,三优,四执行,查询缓存看版本。
作者后面留了一个问题,如果表T中没有字段k,而你执行了这个语句 select *fromTwhere k=1, 那 肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是 在我们上面提到的哪个阶段报出来的呢?
我觉得应该是分析器阶段,因为没办法将字符串k转化为列k。