MySQL基础架构分析

1、MySQL的组成结构。

MySQL主要可以分为两层,server层和存储引擎层。

Server层包括连接器connector、(查询缓存)、分析器parser、优化器optimizer、执行器executor等,以及内置函数(如日期、时间、数学和加密函数等),还有存储过程procedure、触发器trigger、视图view等跨存储引擎功能的实现。

引擎层负责数据的存储和查询提取,可插拔架构,最常用的引擎是InnoDB(并且是mysql5.5.5版本开始的默认存储引擎),其他引擎还有MyISAM和memory等。

2、InnoDB 与 MyISAM 的区别和各自的使用场景

区别
① InnoDB支持事务,MyISAM不支持事务。
② InnoDB支持行锁,MyISAM不支持行锁。
③ InnoDB支持外键约束,MyISAM不支持外键约束。

④ InnoDB的B+树主键索引的叶子节点就是数据文件,普通索引的叶子节点是主键的值,所以InnoDB表必须有主键(若不指定,会自动产生一个主键)。而MyISAM的B+树主键索引和普通索引的叶子节点都是数据文件的地址指针,所以MyISAM可以没有主键。
⑤ 在不用where的情况下执行select count(*),由于InnoDB不保存表的具体行数,所以需要扫描全表获取行数。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快。

使用场景:
① 如果需要使用事务特性,则选择InnoDB;
② 如果表中绝大多数都只是读查询,可以考虑MyISAM;如果既有读也有写,则使用InnoDB

3、一条select语句的执行过程。

首先,客户端通过连接命令连接mysql server端,经过tcp连接之后,sever层的连接器将会对客户端发送过来的用户名和密码进行认证,认证通过后,连接器再查询此用户拥有的权限。如果客户端太久时间没动静,那么连接可能会自动断开,这个时间参数wait_timeout默认设置为8小时。

连接建立完成之后,mysql收到一条select语句之后:
第一步,查询缓存(MySQL8.0版本已删除该模块)。之前执行过的查询语句和结果可能会以key-value值的形式缓存在内存中,因此,如果在缓存中可以找到key(你要的查询),那么就可以直接返回对应的value(结果集)。如果不能找到,则转第二步。

第二步,分析器。此时,主要对sql语句进行词法分析和语法分析。词法分析就是将语句中字符串识别出分别是什么,要做什么事情。比如select表示查询,T表示表名。然后进行语法分析,按照mysql的语法规则判断是否存在语法错误。转第三步。

第三步,优化器。优化器主要对语句的执行进行优化处理,比如怎么join性能更好,怎么选择索引查询速度更快。转第四步。

第四步,执行器。先判断当前查询对所要查询的表是否有权限,如果有权限,则打开表,执行器根据表的引擎定义,使用对应引擎提供的接口。在有索引的情况下,调用引擎接口直接取"满足条件的第一行",再循环取下一行;没有索引的情况下,需要扫描全表,调引擎接口先取第一行判断是否满足条件,满足则将改行放入结果集中,然后依次取下一行,扫描结束后,将结果集返回给客户端。

4、MySQL长连接与短连接怎么选择?

长连接指的是连接成功后,如果客户端持续有请求,则一直使用同一个连接。
短连接指的是每次执行完很少的几次查询,就断开连接,下次查询的时候重建连接。
建议使用的是长连接,因为连接建立过程复杂,使用长连接可以减少连接次数。

持续使用长连接的问题:
由于MySQL执行过程中临时使用的内存是管理在连接对象中的,连接断开的时候才会释放资源。如果持续使用长连接,那么将占用越来越多的内存,最后可能会造成Out Of Memory(OOM)。

怎么解决长连接OOM的问题?
①定期断开长连接。
②通过执行mysql_reset_connection来初始化连接资源,此过程不是重新连接,只是将连接恢复到刚刚创建完成时的状态。

短连接风暴
如果使用短连接,一旦数据库处理得慢一些,连接数就会暴涨。解决办法是,如果连接数过多,应该优先断开事务外空闲太久的连接;如果还不够,再考虑事务内空闲太久的连接。

猜你喜欢

转载自blog.csdn.net/Longstar_L/article/details/106863000