关于数据库Sql的执行过程

数据库 投稿 67100 0 评论

关于数据库Sql的执行过程

一条sql内部是如何执行的:

sql中的内部执行图:

server层包含:

存储引擎层:

Memory 等,现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎

select * from T where ID=10;

连接器:

查询缓存:

MySQL收到查询请求后,会到查询缓存中查看,其中都是保存着以key-value形式的键值对,key为查询语句,value为查询结果,如果有缓存则直接返回value。
不在查询缓存中,会执行后续过程,执行完成后会讲查询的结果保存到缓存中;但是查询缓存的弊大于利;

按需设置:

  1. 将参数 query_cache_type 设置成 DEMAND;所有的SQL都不会进行查询缓存

  2. 通过关键字SQL_CACHE 也可以显示指定

mysql> select SQL_CACHE * from T where ID=10;

在MySQL8.0后取消了这个查询缓存的功能;

分析器:

词法分析和语法分析

  1. 把相关的关键字、表名、字段等分析出来

  2. 根据词法分析的结果进行语法规则的判断,不会就会有错误提示,然后看后面的信息;

优化器:

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序

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。

执行器:

在工程实现上,如果命中查询缓存(mysql8已取消),会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限

编程笔记 » 关于数据库Sql的执行过程

赞同 (149) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽