赞
踩
Mysql架构图
在终端输入mysql -h服务器IP -u用户名 -p密码 连接服务器
该连接过程也是要经过HTTP协议以及TCP三次握手来与服务器建立连接
此时MySql服务器中的执行器就要验证用户名和密码来判断是否可以连接并查询用户的权限,此后的任何操作都会根据用户的权限来进行逻辑判断
(如果连接成功后服务端修改用户的权限并不会立即生效,要等到客户端下一次连接才能生效)
连接成功后,因为我们执行的是一条select语句,MySql会先查询缓存,缓存中的数据是以键值的方式存储,键就是一条sql语句,值是这条sql查询出的数据。如果命中缓存则直接返回数据,如果没有命中则继续下一步操作,查询到结果后再将结果记录到缓存中
ps:看似通过缓存的方式会提高查询效率,其实不然,因为数据库每一次字段的更新都会刷新缓存。比如,有可能在把一次查询到比较大的数据放入缓存后,又数据库进行了更新那么该缓存数据就根本没有利用上,反而在这过程中增加了CPU和内存的负担。所以在MySql8.0后将查询缓存这一步删除掉了。
这一过程中解析器会根据sql语句先后进行词法分析和语法分析
词法分析: 解析器根据sql中的每个关键字生成一个语法树,便于后续操作获取该sql的种类,字段,表名,where条件等等
词法分析: 解析器会根据词法分析生成的语法树来判断该sql是否存在语法错误,比如关键词写错,子句的顺序错误等等,如果出现错误会直接返回
ps:词法分析不会判断sql语句中的表名或字段名是否存在
预处理器有两个作用
把通配符*转换为对应的字段名
判断sql语句中的表名或字段名是否存在
优化器的作用就是制定一个最优的查询方案,在有多个索引的情况下,选择执行效率最高的查询方式。
主要是对二级索引中覆盖索引问题的优化
比如有一张学生表 id是主键索引 name是二级索引
sql语句是 select id from student where id > 1 and name like ‘李%’
显然这条语句出现了覆盖索引 所以先查询二级索引找到符合条件的结点,由于二级索引的B+树的叶子结点存放的是id主键值,我们就根据二级索引树中符合条件的id来进行筛选,没有必要再进行回表了,因为查询主键索引的B+树的成本比查询二级索引B+树成本高,大大增加了查询效率
优化器就是对这一过程进行优化,判断查询哪颗索引树的查询效率最高
执行器就会根据优化器生成的执行方案到存储引擎中进行查询
有三种查询情况分别是
1 假如sql语句为 select * from student where id = 1
由于这是一条等值查询语句,并且主键不可能出现重复,所以优化器决定访问类型为const进行查询,通俗地说只会调用一次存储引擎的查询接口
2 假如sql语句为 select * from student where score > 80
score字段不是索引字段 那么查询器就会对student表进行while循环 调用存储引擎全表扫描的接口。每调用一次查询接口,存储引擎就会返回student表的一行记录,执行器判断该行记录的score是否大于 80如果符合条件直接返回客户端 并再次调用查询接口,直到查询到该表的最后一条记录。
3 假如sql 语句为 select * from student where age > 18 and score > 60
age和score为联合索引的情况下 由于遵循的最左前缀原则,只有age字段能利用到联合索引 score无法利用该索引
如果不使用索引下推流程如下
可以发现如果没有索引下推 二级索引中非叶子结点存储的score毫无用处,每次都要进行回表操作再将完整记录返回给执行器让执行器进行判断score是否符合条件
如果使用索引下推 判断score的过程就交给了存储引擎
可见如果使用了索引下推 虽然由于最左前缀无法使用联合索引查询,但是大大减少了回表的次数,增加了查询效率
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。