01 _ 基础架构:一条SQL查询语句是如何执行的?
从MYSQL的架构上来看,主要包含两层Service层和存储引擎,Service层包含连接器、查询缓存、分析器、优化器、执行器。
连接器
连接数据库时,会在工具中可能是命令行也可能是图形化工具,都需要提供账号和密码,此时就需要通过连接器,连接器会检查mysql.user表中的用户名和密码是否正确。
当用户名和密码正确时,提示连接成功,并读出当前用户所有的权限,这也是执行器判断是否拥有权限的依据;否则提示连接失败。
连接成功之后如果没有进行后续操作,连接就会进行空闲状态,使用show processlist
命令,会看到Command
列显示Sleep
如果一个连接建立之后长时间没有动静,这个时间是由wait_timeout控制的,默认是8小时,连接器就会断开该连接,如果断开之后,该连接再发送请求,就会收到错误提示:"Lost connection to MySQL server during query"
,此时需要重新连接,再次发送请求执行。
建立连接的过程是十分复杂的,所以建议尽量减少建立连接动作,即尽量使用长连接。
但使用长连接后,可能会使MySQL内存涨的很快,这是因为MySQL运行的临时内存是保存在连接对象中的,所以可能会被系统强杀(OOM),这里有两种解决方案
- 定期断开占用内存较大的连接,并重新连接
- 在MySQL5.7或更高的版本,可以通过执行
mysql_reset_connection
,重新初始化连接资源,而不需要重新连接