目录
思维导图:
01|基础结构 一条sql查询语句是如何执行的? | 八九. | 思维导图(新) | ProcessOn
密码:oHBW
一.server层
server主要包括连接器,查询缓存,分析器,优化器,执行器等,以及所有的内置函数,
所有的跨存储引擎功能都在这一层实现,比如存储过程,触发器,视图等
1.连接器
使用数据库第一步会连接到这个数据库,
连接器负责和客户端建立连接,获取权限,维持和管理链接
(1)登录命令
mysql -h$ip -P$prot -u$user -p
用户名和密码不对,就会收到一个'Access denied for user'的错误,然后客户端程序结束执行
用户名和密码正确,就会根据链接里面的权限判断逻辑,依赖于此时读到的权限
(2)链接完成
连接完成,没有后续的动作,就会处于空闲状态,根据命令‘show processlist’显示的command看到他的状态,sleep为睡眠状态,query为查询状态等
客户端太长时间没有动静,就会自动断开连接,默认时间为8个小时
(3)长连接与短连接
长连接:连接成功后,客户端持续友情,则一直使用同一个请求
短链接:每次执行完几次查询就会断开连接,下次查询再重新建立一个
建立连接的过程复杂,所以要减少建立连接的动作,尽量使用长连接
这些连接会在连接断开时候才释放,如果长时间积累下来,就会导致内存占用太大,
被系统强行杀掉,会导致mysql异常重启
解决方案
1.定期断开长连接,程序里面判断执行过一个占用内存大的查询后,断开连接,要查询再重新连接
2.用mysql5.7或更高版本,执行一个大的操作后,会自动执行mysql_reset_connection来重新初始化连接资源,将连接资源会断哦刚刚创建时的状态,这个过程不需要权限认证
2.查询缓存
mysql拿到一个查询请求后,回到查询缓存看一下,根据之前执行过的查询语句,是根据key-value对的形式存储的,key是语句,value是查询的结果
如果缓存中没有,会把查询中的结果放到查询缓存中,以便下一次查询的使用
但是不建议用查询缓存,mysql8之后也没有查询缓存
因为更新表会清空,这不是影响运行了吗,除非有一张静态表格
3.分析器
如果没有命中查询缓存,就要开始执行真正的执行语句了,就是对sql语句的解析
语法分析:判断你写的sql是否正确
4.优化器
表中存在多个索引的时候,决定使用哪个索引;
多表join时候,决定各个表的执行顺序,就是where关联多个条件(有and),先查询那个条件,先查询的条件不同,效率也不同
5.执行器
执行查询权限之前,会判断是否有这个表的查询权限
执行流程:
1.调用引擎接口去拿第一行数据,判断条件是否成立,不成立就跳过,成立就把这条结果放到结果集中
2.反复执行,直到最后一行
3.执行器将上述遍历的结果集给客户端,查询结束
查询日志中有一个rows_examined的字段,表示这个语句执行过程中扫描了多少行
二.存储引擎
是唯一一个支持事务的引擎, 不同的存储引擎共用一个Server层(后面的章节会说明)
三.问题
如果表中不存在我们需要查询的字段,
这个错误是在那个阶段报出来的呢?
分析器