连接器:客户端在连接时验证账号密码,并获取该账号所拥有的权限,之后这个链接里面的权限判断都是基于此时读到的权限为根据,因此,更改一个账号的权限后需要重新连接才有效。如果长时间没有操作,连接器会断开,默认时8h。
每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或者销毁线程。
在数据库中有两种连接:
短连接:每次执行完很少的几次查询就断开连接,下次想查询时,就要重新建立一个
长连接:如果客户端持续有请求,那就一直使用同一个连接
建立连接是比较麻烦的,首先要发送请求吧,发送了请求要去验证账号密码吧,验证完了要去看你所拥有的权限吧,所以在使用过程中,尽量使用长连接。
但是使用长连接又有新的问题:有时候,你会发现 MySQL 占用内存,因为是长连接嘛,所以它会在断开的时候才将资源释放掉。
这个时候可以考虑下面两种方案:
定期断开长连接
如果使用的是 MySQL 5.7 或者更高版本,可以在每次执行一个比较大的操作之后,通过执行 mysql_reset_connection 来重新初始化连接资源,这个过程不需要重新连接和权限验证。
查询缓存:
接下来就是去查询缓存
首先看缓存里面有没有,如果有呢,那就没有必要向下走,直接返回给客户端结果就可以了。因为查询缓存的失效非常频繁,只要有对一个表的更新,那在这个表上的所有查询缓存都会被清空。所以就会导致 MySQL 建立起来的缓存,还没怎么用,一个更新操作,就失效了。
分析器:分析器首先会进行"词法分析",词法分析就是 select * from T where id=10; ,它会将 select 识别出来,接下来会将 T 也识别出来,然后将 where 后面的条件也识别出来,“词法分析”之后,接下来是“语法分析”,语法分析主要就是分析输入的 SQL 语句合不合法
就比如英语里面的语法 “我用 is , 你用 are ”这种,如果不对肯定是不可以的,语法分析之后发现你的 SQL 语句不符合规则,就会收到 You hava an error in your SQL syntax 的错误提示。
优化器:
经过分析器分析之后, MySQL 就知道你要的是什么了
但是就像条条大路通罗马一样,看似是一条简单的 SQL 查询语句,有可能有好多条执行路径可以走,比如说要查询的表里面有多个索引,我使用哪儿个索引效率会比较高呀;多表联查的时候,我先关联哪儿个表效率会比较高呀
像这种就是优化器需要做的事情
执行器:
优化器做完优化之后,就到了执行器
执行器就是要去执行语句了嘛,那我肯定要看看对于要查询的表 T 有没有查询权限,如果没有直接就拒绝,这没啥说的 如果有的话,那就会这样(在这里以 InnoDB 为例):
调用 InnoDB 引擎接口取这个表的第一行,判断 ID 的值是不是 10 ,如果不是就跳过,如果是那就放在结果集中;
调用引擎接口取“下一行”;重复相同的判断逻辑,直到这个表的最后一行
执行器将上述遍历过程中所有满足条件的行,组成记录集返回给客户端
至此,语句执行结束