一条sql内部是如何执行的:
sql中的内部执行图:
可以分为两部分:server和存储引擎
server层包含:
存储引擎层:
指定存储引擎:engine=memory
不同存储引擎的表数据存取方式不同,支持的功能也不同.
select * from T where ID=10;
连接器:
查询缓存:
连接建立后,就可以执行select语句,然后会进行查询缓存,
MySQL收到查询请求后,会到查询缓存中查看,其中都是保存着以key-value形式的键值对,key为查询语句,value为查询结果,如果有缓存则直接返回value。
不在查询缓存中,会执行后续过程,执行完成后会讲查询的结果保存到缓存中;但是查询缓存的弊大于利;
按需设置:
- 将参数 query_cache_type 设置成 DEMAND;所有的SQL都不会进行查询缓存
- 通过关键字SQL_CACHE 也可以显示指定
mysql> select SQL_CACHE * from T where ID=10;
在MySQL8.0后取消了这个查询缓存的功能;
分析器:
然后对于sql语句进行分析,主要词法分析和语法分析
- 把相关的关键字、表名、字段等分析出来
- 根据词法分析的结果进行语法规则的判断,不会就会有错误提示
You have an error in your SQL syntax
,然后看use near
后面的信息;
优化器:
通过分析器,MySQL知道了执行目的;主要是决定sql中执行的顺序,
select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
--等价于
select * from ti join t2 where t1.ID = t2.ID and ti.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 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句;