MySQL可分为Server层和存储引擎两部分。从MySQL5.5.5版本开始,InnoDB成为了默认存储引擎。
select * from T where ID=10;
连接器
负责跟客户端建立连接,获取权限、维持和管理连接。
mysql -h&ip -P&port -u&user -p
执行该命令进行认证后即可连接到数据库,如果密码不对,则会收到 "Access denied for user"的错误
查询缓存
在建立完连接后,就可以执行select语句了,这时候就会来到第二步:查询缓存。
Mysql拿到一个查询请求后,就会先到查询缓存中查看,之前执行过的语句及结果可能会以key-value的形式,被直接存在内存中。key是查询的语句,value是查询的结果。如果查询能直接在缓存中找到这个key,则可以直接返回这个value。
**大多数情况下不建议使用查询缓存**,因为查询缓存的失效非常频繁。只要有对一个表的更新,这个表上的所有查询缓存都会被清空。(Mysql8.0开始没有查询缓存的功能)
分析器
分析器会先做"词法分析",MySQL需要识别出SQL语句里面的字符串分别是什么,代表什么。从"select"这个关键字识别出这是一个查询语句,把"T"识别成表名T,把字符串"ID"识别成列ID。
接着就会做"语法分析",根据语法规则判断输入的这个SQL语句是否满足MySQL的语法,如果语句不对,则会收到 "You have an error in your SQL syntax"的错误提醒。
优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句中有多表关联的时候,决定各个表的连接顺序。比如:
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通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入到执行器阶段开始执行语句。
开始执行的时候,会先判断是否有执行查询的权限,如果没有,就会返回没有权限的错误。如果有权限,就会打开表继续执行,执行器会根据表的引擎定义,去使用这个引擎提供的接口,将满足条件的行组成的记录作为结果集返回给客户端。
一条SQL查询语句时如何执行的?