MySQL基础架构

image.png

Mysql的架构分为两层:Server层和存储引擎层。

Server层提交与具体存储无关的操作,如内置函数,存储过程、触发器、视图等。具体的查询、存储调用存储引擎提供的接口。

存储引擎负责数据的存储和提取。其以插件的形式存在,可以根据需求替换不同的存储引擎。

select * from T where ID=10; 的执行过程

连接器

需要先跟连接器建立连接。连接器负责客户端的链接、获取权限、维持和管理链接。

mysql -h$ip -P$port -u$user -p
复制代码

验证通过时,连接器会到权限表查询你拥有的权限,在断开链接之前,所有操作都基于此时读到的权限,即使你的权限被修改。

可以通过 show processlist 查看所有链接,默认超过8个小时没有操作,连接器将自动断开链接。具体是由wait_timeout,这个参数控制。

长链接和短链接,由于建立链接的过程笔记复杂,所有尽量减少链接的次数,使用长链接。

长链接可能会导致MySQL内存占用涨的较快,这是因为MySQL在执行过程中临时使用的内存是管理在链接对象中的。这些资源会在断开链接的时候才会释放,所以一个长链接,长期使用下来,可能会导致内存占用过大,被系统杀掉(OOM),现象是MySQL异常重启。

解决此问题的方案有两种:

  1. 定期断开长连接,使用一段时间或者一次查询占用内存量较大,可以断开链接,之后查询在新建立链接。
  2. MySQL5.7+,可以通过 mysql_reset_connection 来重新初始化链接资源。这个过程不需要重新链接和重新做权限验证,但是会恢复到刚刚创建完时的状态。

查询缓存

建立链接后可以执行查询了。执行的第二步:查询缓存。
MySQL拿到查询请求后,验证缓存中是否存在,如果存在返回缓存内容。如不存在,执行后续操作,将结果放入缓存。
在大多数情况,不建议使用缓存。因为缓存查询往往弊大于利。其原因是,当对某张表发生修改,则该表的全部缓存将被清空。可以设置query_cache_type为DEMAND,这样默认的sql语句不会查询缓存。而需要使用缓存的语句可以用SQL_CACHE显示指定。如下:

 select SQL_CACHE * from T where ID=10复制代码

在MySQL8.0查询缓存废除。

分析器

解析sql语句,将字符串对应到要查找的表、字段。

优化器

优化器是在当表中有多个索引,决定走那个索引。或者在有多表关联的时候,决定各个表的连接顺序。

执行器

开始执行,会先检查你对该表是否有查询权限。然后打开表继续执行,执行器会根据表的引擎定义,使用对应引擎提供的接口。

www.mysqlzh.com/

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享