MySQL架构分层总结

小文blog小文 2018-11-27 15:55 276人围观

MySQL架构.png

线程/连接管理

也称连接器,主要负责管理连接和权限认证。

客户端通过经典的TCP三次握手后,连接器就要验证你的身份,如果账号密码不对,你就会收到Access denied for user的错误。

账号密码验证通过,会继续验证该账户的权限,对应的去权限表查你的权限,只要此连接不关闭,管理员账户对该账户进行权限修改不会被影响。

连接超时时间由wait_timeout控制,默认是8小时,8小时内没有任何查询,则该连接会被连接器断开。

建立连接的过程比较复杂,所以建议使用连接池,并维护好断线重连机制,如果连接池使用过程中发现MySQL内存涨的特别快,这是因为MySQL在执行过程中临时使用的内存是连接管理对象里的,这些资源会在连接断开的时候释放,所以长连接不断积累,可能导致内存过高,被系统kill掉,导致异常重启。解决方法是1、一定查询量或一段时间后断开重连2、5.7版本以上可以使用mysql_reset_connect进行初始化连接。

查询缓存

作用是是看看是否有该语句的缓存,如果有则返回,没有则走下一步分析器。之前执行过的语句及结果会以类似key-value的形式缓存起来。

但是大多数情况下不建议用查询缓存,因为查询缓存失效很频繁,表一有更新就会导致查询缓存的失效。所以缓存命中率低,性能低下。查询缓存只适合静态表或不经常更新的表。8.0版本已经移除掉查询缓存的功能了。

分析器

查询缓存没有命中,那么就会来到分析器。

分析器拿到sql,首先会做词法分析,比如SELECT等关键词识别等,如果有语法错误,就会在该层抛出错误,you have an error in your sql巴拉巴拉...

优化器

经过了分析器,MySQL已经知道你要查什么做什么了,优化器主要做重写查询、决定表的读取顺序、索引的选择、等,比如你用name做索引,但是优化器觉得全表更好,它就会使用全表扫描,比如你的联合索引 a,b,c 你的sql是where a=1 and c=2 and b=3 会优化为where a=1 and b=3 and c=2。

执行器

判断权限,如果有权限,进一步打开表,根据表的引擎,去引擎层调取对应的API,引擎层返回操作结果,然后返回给客户端。

引擎层

InnoDB啦,MyIsam啦


转载请注明来自小文blog,本文标题:MySQL架构分层总结

发布评论
生活是一场戏,主角当累了,你亦可成为观众,停下脚步,歇一歇