基本架构
MySQL大体上来说,可以分为Server层和存储引擎两部分。Server层包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,如存储过程、触发器、视图等。存储引擎层负责数据的存储和提取。逻辑架构图如下图所示。
接下来分别说明Server层每个组件的作用。
连接器
主要用于与客户端建立连接、获取权限、维持和管理连接,连接命令: mysql -h$ip -P$port -u$user -p
输完命令后,输入密码,如果密码正确,会到权限表中查看该用户拥有的权限,这个连接里面的权限判断逻辑都依赖于登录时查到的权限,也就是说连接的权限仅取决于连接建立时的权限,修改权限的话,要重新建立新的数据库连接。
数据库建立连接的过程比较复杂,尽量使用长连接来减少建立连接的动作。但是全部使用长连接会导致MySQL占用的内存涨的特别快,因为MySQL在执行过程中临时使用的内存是管理在连接对象里面,这些资源在连接断开的时候才会得到释放。当内存占用太大的时候,就会被系统强行杀掉(OOM),造成MySQL异常重启。
考虑以下两种方案来解决这个问题:
- 定期断开长连接。
- 每次执行一个占用内存比较大的查询后,执行mysql_reset_connection
重新初始化连接资源。这个过程不需要重连和重新做权限验证,但会将连接恢复到刚创建的状态。
查询缓存
MySQL在拿到查询请求后,会先到查询缓存中查找结果,如果之前执行过这个查询语句,那么语句及其查询结果会以key-value对的形式保存在内存中,key是语句,value是结果,这时就直接把value返回给客户端。
一般不建议使用查询缓存,因为查询缓存失效非常频繁,只要对表进行了更新,那么关于这个表的所有查询缓存都被清空,所以如果对于一个更新压力大的数据库,查询缓存的命中率就会很低 。
可以通过设置query_cache_type为DEMAND,这样默认的SQL语句都不使用查询缓存。
ps:MySQL8.0版本删除了查询缓存的功能。
分析器
分析器先做词法分析,通过分析你输入的SQL语句来识别出里面的字符串分别是什么,代表什么。
做完词法分析后,再做语法分析,分析器根据语法规则,判断你输入的这个SQL是否满足MySQL语法。
优化器
经过分析器的SQL语句,会到优化器进行优化处理,比如表里面如果有多个索引的时候,决定用哪个索引;或者是多表关联查询的时候,决定表的连接顺序。
执行器
语句经过优化后,就要进入执行阶段,开始执行的时候,要先判断权限,如果没有,就返回没有权限的错误。如果有权限,就打开表继续执行。