mysql分为server层和存储引擎层
server层主要包括连接器、查询缓存(mysql 8.0版本后删除)、分析器、优化器、执行器等
连接器
负责用户登录数据库,进行身份验证,会校验账号密码,权限等。
如果账号密码验证通过,就会查询该用户的权限,之后基于这次连接的操作的权限都依赖于此时查到的权限,也就是只要这个连接不断开,管理员修改了用户权限,也不会对此连接产生影响
连接器还可以维持和管理连接,客户端长时间不操作,连接器就自动超时断开,默认超时时间是8小时,如果断开后,客户端再次请求,需要重新建立连接
连接状态:
sleep:线程在等待客户端发送数据
query:连接线程在执行查询
locked:线程在等待表锁的释放
sorting result:线程正在对结果进行排序
sending data:向请求端返回数据
长连接:连接成功后,如果客户端有请求一直使用一个连接
短链接:执行完几次查询后就断开连接,下次重新建立连接
tcp建立连接过程复杂,所以应该尽量使用长连接
使用长连接的问题,内存得不到释放,一直积累下来导致内存过大,oom被系统强行杀掉
解决以上问题的方法:
1.定期断开长连接,或者判断执行完一个占用内存很大的查询后,断开连接
2.在执行一个比较内存大的操作后,执行mysql_reset_connection,不需要重连和权限验证,会回到连接刚创建的状态
缓存
缓存中是kv对,key是查询语句,value是查询结果
某张表进行更新,那么这张表的查询缓存被清空
查询缓存失效非常频繁,查询缓存的命中率低
分析器
词法分析,语法分析,语义分析
就是判断sql语句是否符合语法规则,并且弄清楚sql语句要做什么
优化器
对sql语句进行优化,生成最优的执行方案
执行器
开始执行查询,在执行前会查询权限