MYSQL 基础架构

基础组件

MYSQL 可以分为两大部分Server层和存储引擎层两大部分组成;
Server层主要包含了,连接器,查询缓存、分析器、优化器、执行器;涵盖了MYSQL的大多数(诸如日期、时间、数学和加密函数)核心功能,所有垮存储引擎的功能都在这一层实现,比如,存储过程,触发器,视图等;
而存储引擎负责数据的存储和提取,具备可插拔式,支持InnoDB、MyISAM、Memory等多个存储引擎,从5.5版本开始,InnoDB成为了默认存储引擎;
MYSQL 基础架构_第1张图片

连接器

首先要先连接到数据库,连接器主要负责,连接管理,权限校验,连接命令如下:

mysql -h $host -P$port -u$user -p

连接命令中的mysql是客户端工具,用来和服务器建立连接,当完成经典的TCP握手后,连接器就要开始验证身份;
连接建立之后,如果没有后续的动作,连接将一直空闲,直至连接器自动断开,默认连接的有效时间是8个小时;由参数wait_timeout来控制,期间可以采用show processlist命令查看;
如果连接断开的时候客户端发起了请求,就会收到一个错误提示:Lost connection to MySQL serve…,这个时候如果需要执行,则必须重连。
为了尽量减少连接数据库带来的开销,应该尽量使用长连接,因为短连接在每次执行完后就会断开,需要重新建立。
但使用长连接也有弊端,如果连接数过多,会导致MYSQL占用内存涨得比较快,因为MYSQL在使用的过程中临时使用的内存管理是在连接对象中的,如果长连接积累下来就会导致oom;

查询缓存

MYSQL提供了查询缓存,每次查询的语句以及结果,都会以key-value的形式缓存到本地,如果命中缓存,则直接返回;
然后并不建议使用查询缓存,由于缓存所在表的任何一个更新都会导致缓存清除,查询缓存的命中率可能会比较低;
MYSQL提供了按需使用的方式,可以将query_cache_type参数修改为DEMAND,这样对于默认的SQL语句都不使用缓存,对于明确指定SQL_CACHE的语句则会查询缓存;例如:

select SQL_CACHE * from T whe...

注:MYSQL8.0的版本直接将缓存模块去除,因此8.0版本开始则彻底没有查询缓存的功能。

分析器

如果未命中缓存则会进入分析器执行,分析器主要做词法分析和语法分析;
词法分析用于解析sql语句中每个字符代表的含义,如select关键字会被识别为查询语句,T字符串会被识别为“表明T”,字符串ID会被识别为“列ID”;
语法分析则会根据词法分析的结果来判断语句是否符合MYSQL语法;

优化器

经过分析器,优化器会选择执行方案;比如,表中有多个索引,MYSQL要使用哪个索引,多表连接查询的时候又要根据什么顺序来执行;

执行器

进入了执行阶段,首先会先判断当前账号是否有表的操作权限,如果没有就返回错误;

mysql> select * from T where ID=10;
ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'

对于上述语句,如果没有索引,MSYQL会选取第一行进行判断,如果符合ID=10则存入结果集,否则跳过继续进入下一行,如此循环,直到表的最后一行;
对于有索引的表,执行逻辑也差不多,第一次调用的是“满足条件的第一行”,之后循环调用“满足条件的下一行”的接口;
这些接口都是存储引擎已经事先定义好的;
注意:在数据库的慢查询日志中可以看到rows_examined的字段,表示执行器执行过程中调用存储引擎获取的数据的数据行;
在某些场景下,该字段并不一定等于存储引擎实际扫描行数。

你可能感兴趣的:(mysql)