MySQL架构
Last updated
Last updated
MySQL可以分为Server层和存储引擎层两部分。
Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。
连接器负责跟客户端建立连接、获取权限、维持和管理连接。
客户端建立连接后,即使权限被管理员账号修改,也不会受到影响。需要重新建立连接才会使用新的权限设置。
数据库里,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。建立连接的过程通常比较复杂,因此通常建议使用长连接。
由于MySQL执行过程中临时使用的内存是管理再连接对象里的,这些资源再连接断开的时候才释放,所以长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是MySQL重启了。解决方案有以下两种
定期断开长连接
MySQL5.7之后,可以通过mysql_reset_connection来初始化连接资源。
MySQL拿到一个查询请求后,会查找查询缓存。之前执行过的语句及其结果可能会以key-value对的形式直接缓存再内存中。如果命中缓存,会直接返回。但是由于查询缓存失效频率,只要有对一个表的更新,这个表上所有的缓存就会情况。因此不推荐使用查询缓存。
MySQL可以通过参数query_cache_type设置成DEMAND,默认的SQL语句不使用查询缓存。对于需要查询缓存的语句,使用显示指定。
MySQL 8.0版本查询缓存功能被删除。
分析器会先做“词法分析”,然后做“语法分析”。
词法分析是识别字符串分别是什么,代表什么。比如下面的语句,通过"select"识别出是一个查询语句,然后将"T"识别成表名"T",字符串"ID"识别成"列ID"。
“语法分析”会根据语法规则,判断输入的SQL语句是否满足MySQL语法。
优化器是再表里面有多个索引的时候,决定使用哪个引擎;或者再一个语句有多表关联(join)的时候,决定各个表的连接顺序。
执行器开始执行前会查询权限,如果权限不足会返回权限错误。如果有权限,就打开表继续执行。打开表的时,执行器使用表定义的引擎接口。
慢查询日志rows_examined字段表示语句执行过程中扫描了多少行。这个行值就是再执行器每次调用引擎获取数据行的时候累加的。引擎扫描行数跟rows_examined并不是完全相同。