select * from T where ID=10;
在完成经典的 TCP 握手后,链接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。若是用户名密码认证经过,链接器会到权限表里面查出你拥有的权限。以后,这个链接里面的权限判断逻辑,都将依赖于此时读到的权限。(这就意味着,一个用户成功创建链接后,即便你用管理员帐号对这个用户的权限作了修改,也不会影响已经存在链接的权限。修改完成后,只有再新建的链接才会使用新的权限设置。)
MySQL 拿到一个查询请求后,会先到查询缓存看看,以前是否是执行过这条语句。以前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。若是你的查询可以直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。
可是大多数状况下建议不要使用查询缓存,为何呢?由于查询缓存每每弊大于利。mysql
查询缓存的失效很是频繁,只要有对一个表的更新,这个表上全部的查询缓存都会被清空。对于更新压力大的数据库来讲,查询缓存的命中率会很是低。除非你的业务就是有一张静态表,很长时间才会更新一次。好比,一个系统配置表,那这张表上的查询才适合使用查询缓存。 mysql能够经过query_cache_type参数配置默认不进行缓存。若是配置了不进行缓存,执行sql语句时,能够显示指定使用缓存: select SQL_CACHE * from T where ID=10; 须要注意的是,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始完全没有这个功能了。
若是没有命中查询缓存,就要开始真正执行语句了.sql
分析器首先会进行sql解析。分为如下几个步骤:数据库
1.词法分析 解析sql语句,好比从select关键字识别这是一个查询语句,将"T"识别成"表名T",把"ID"识别成"列ID" 2.语法分析 根据语法规则,判断你的sql是否知足mysql语法
优化器是在表里面有多个索引的时候,以为使用哪一个索引;或者有多表join的时候,决定各个表的链接顺序。缓存
select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20; 既能够先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2,再判断 t2 里面 d 的值是否等于 20。 也能够先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1,再判断 t1 里面 c 的值是否等于 10。 这两种执行方法的逻辑结果是同样的,可是执行的效率会有不一样,而优化器的做用就是决定选择使用哪个方案。
MySQL 经过分析器知道了你要作什么,经过优化器知道了该怎么作,因而就进入了执行器阶段,开始执行语句。架构
select * from T where ID=10;
开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限。 若是有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。 若是ID字段没用索引,那么执行流程是这样的:优化
1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是否是 10,若是不是则跳过,若是是则将这行存在结果集中; 2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。 3. 执行器将上述遍历过程当中全部知足条件的行组成的记录集做为结果集返回给客户端。
极客时间:《mysql实战45讲》code