mysql学习笔记(一)


mysql基本架构示意图

客户端

server层:(所有跨存储引擎的操作均在这一层完成,包含下面mysql核心功能及内置函数均在这一层完成)

连接器、分析器 -> 查询缓存、优化器、执行器

存储层:(负责数据的存储和提取,其架构模式是插件式的,支持innodb、myisam、memory等多个存储引擎)

存储引擎

总结:不同的存储引擎共用一个server层,即连接器到执行器的部分是一样的。

连接器

连接器会校验用户的账号和密码,验证通过后,然后会去权限表获取用户拥有的权限。之后,这个连接里面的权限判断都将依赖此时读到的权限。这就意味着,用户连接成功后,再去修改权限,在当前连接下是不生效的,只有再新建连接才会使用新的权限配置。

连接完成后,如果后续没有操作,则该连接处于sleep空闲状态。可通过show processlist查看连接的状态

客户端如果长时间没有动静,则连接器会自动断开,具体时间由wait_timeout控制,默认是8小时。

数据库连接,分长连接和短连接两种。

长连接:数据库连接成功后,如果客户端一直有请求,则会一直使用同一个连接。

短连接:每次执行完很少的几次连接后,会自动断开。下次查询会再重建一个。

建立连接的过程通常很复杂,所以尽量减少连接的动作,也就是尽量使用长连接。

使用长连接,mysql占用内存会涨的比较快。因为mysql在执行过程中临时使用的内存是管理在连接对象里面的,只有在连接断开后,内存再会被释放。如果长连接累计下来,可能导致内存占用过大,被系统强制杀掉(OOM),从现象上来看就是mysql异常重启。

解决方案:

1.定期断开连接,使用一段时间后,或程序执行过一个占用内存比较大的查询后,断开连接,之后查询再重新连。

2.mysql5.7及以上版本,可在执行过一个大的操作后,通过执行mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建的状态。

show processlist;