赞
踩
select *
中的*
扩展为表上的所有列。我们可以将MYSQL的架构分为两层:server层和存储引擎层
MySQL服务收到SQL语句后,就会解析出SQL语句的第一个字段,看是什么类型的语句
如果是查询语句(select 语句),MySQL就先去查询缓存里查找缓存数据,看看之前有没有执行过这个命令,这个查询缓存是以key - value
形式来保存的,key 为 SQL 查询语句, value 为 SQL语句查询的结果
如果查询语句命中查询缓存,那么就会直接返回给 value 给客户端。如果查询的语句没有命中查询缓存,那么就要继续往下执行,等执行完后,查询的结果就会存入查询缓存中。
但是这个查询缓存的效果并不是很好,对于更新比较频繁的表,查询缓存的命中率很低的,因为只要一个表有更新操作那么这个表的查询缓存就会被清空,如果刚缓存了一个查询结果很大的数据,还没被使用的时候,刚好这个表有更新操作,查询缓冲就被清空了,相当于缓存了个寂寞。
所以,MySQL 8.0 版本直接将查询缓存删掉了,也就是说 MySQL 8.0 开始,执行一条 SQL 查询语句,不会再走到查询缓存这个阶段了。
经过解析器后,接着就要进入执行 SQL 查询语句的流程了,每条SELECT
查询语句流程主要可以分为下面这三个阶段:
select *
中的*
符号扩展为表上的所有列。经过预处理阶段后,还需要为 SQL 查询语句先制定一个执行计划,这个工作交由优化器来完成的。
优化器主要负责将 SQL 查询语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。
当选择了执行方案后,MySQL 就准备开始执行了,首先执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息,如果有权限,就会去调用引擎的接口,返回接口执行的结果。
执行一条 SQL 查询语句,期间发生了什么?
select *
中的 *
符号扩展为表上的所有列。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。