mysql45讲
第一讲,一个查询语句是如何执行的。
mysql可以分为 server层和存储引擎层。
server层包括连接器,查询缓存,分析器,优化器,执行器等。
存储引擎负责数据的存储和提取。默认使用innodb,在建表时可以自行选择
连接器
连接器负责跟客户端建立连接,获取权限,管理和维持连接。
在我们使用命令行窗口连接mysql的时候,这个窗口就属于客户端工具,用来跟服务端建立连接,在经过tcp握手后,连接器
就要开始认证你的身份,需要输入账号和密码
- 如果密码/账号不正确,会提示Access denied for user ,然后客户端程序结束执行。
- 正确,连接器会到权限表里查你拥有的权限,此处连接内所有的权限判断都基于本次查询。
这也意味着,一个用户建立连接之后,即使你用管理员账户修改了该用户的权限,也是下次连接才生效。
链接建立之后,如果客户端长期没有操作,连接器会将连接断开。这个是由wait_timeout参数控制的,默认值是8h。
数据库里连接建立之后,客户端一直有请求,则一直使用同一个连接。
短连接是指,建立连接之后,只执行很少的几次操作就断开连接,下次操作重新建立连接。
由于建立连接的操作比较复杂,所以一般使用长连接。
但是使用长连接可能会出现,mysql占用内存涨的特别快,这是由于mysql在执行过程中使用的内存是管理在连接对象里的
如何解决
- 定期断开长连接。使用一段时间或者进行一次占用内存的大查询之后,就断开连接,需要查询再重新连接
- 如果使用5.7或者更新版本,可以在大查询后执行 mysql_reset_connection ,这个操作,不需要重连
但是会重置为连接刚刚建立的状态
查询缓存
连接建立后,就可以执行查询了,就来到这一步。
mysql拿到一个查询请求后会先到查询缓存看看,之前是否执行过这条语句,之前执行过的查询会以key,value
的形式保存在内存中,key是查询语句,value是查询结果。如果你的查询语句能够在这个缓存中找到,那么这个value就会被直接返回给客户端
但是不建议用查询缓存,因为一旦某个表做了更新,那么这个表上的所有查询缓存都会被清空
注:mysql8.0已经把这个功能整个删除了。
分析器
词法分析,分析每个单词的含义
语法分析:分析sql语句是否正确
优化器
经过分析器,mysql就知道你想干嘛了,在开始执行之前还需要经过优化器的处理
优化器主要是决定使用哪个索引和表的连接顺序
执行器
开始执行之前,需要先判断你是否有这个表的查询权限,没有则返回报错,有权限则打开表执行。
没有利用到索引:调用innodb引擎接口取这个表的第一行,判断是否满足条件,是将这行保存在结果集中
调用引擎取下一行,充足判断,知道这个表的最后一行。
执行器将上述遍历过程中所有满足条件的行组成的结果集返回给客户端
。有索引的查询,调用的是满足条件的行这个接口,之后循环调
评论区