MySql的内部组件

  • mysql内部分为客户端,server层和引擎层,具体关系及作用如图
  • MySql内部组件结构.jpg

    Server层

  • 主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

    Store层

  • 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,目前是默认存储引擎。

    各组件作用

    连接器

  • 各种客户端工具都可以连接MySql服务器进行数据操作,但是都需要进行连接建立后才可以进行操作

  • 连接器就负责多个客户端的连接工作以及客户端的权限管理
  • 一个用户在连接使用的过程中权限被修改是不能立即生效的,只有再断开重新连接是校验权限后才会生效
  • 用户权限表在user表中
  • wait_timeout默认8小时
  • Mysql在执行过程中临时使用的内存是管理在连接对象里面的,需要连接对象断开才能释放资源,长连接对象长期累积就会导致内存占用太大,被系统强行kill掉,表面看就是MySql重启

    • 解决办法:
    • 定期断开长连接,使用一段时间后或者执行过内存占用大的查询后,可以断开,下次查询重连
    • 5.7版本后,在执行比较大的操作后可以执行mysql_reset_connection重新初始化资源,此过程不会重新做权限验证,只是恢复连接到初始状态

      查询缓存

  • select语句执行时会先在查询缓存中看看之前有没有执行过相同语句,有的话会从缓存取结果

  • 缓存中存的是sql语句和结果的key-value对
  • 8.0版本移除了查询缓存

    分析器

  • 词法分析,将sql关键字和表名和条件等信息分析出来

  • 语法分析,分析sql语句是否符合要求,sql不对的话会返回语法问题
  • 语义分析
  • 构造执行树
  • 生成执行计划
  • 计划的执行

    优化器

  • 优化器根据sql语句查询条件确定使用哪个索引

  • 多表连接时确定表的连接顺序,使用小表驱动大表,表数据少的过滤出来再去表数据量大的表查询数据过滤

    执行器

  • sql语句执行前先查询对表有没有权限,有权限才可以继续执行

  • 然后查询引擎层接口,过滤出符合条件数据进行返回

    bin-log

  • bin-log是用来记录sql执行逻辑,会记录表的创建,更新,删除操作

  • bin-log在MySql的server层实现(引擎层也会用到)
  • bin-log是逻辑日志,记录一条sql语句原始逻辑
  • bin-log不会限制大小,日志追加写入,不会覆盖之前逻辑
  • 在my.cnf文件可以配置bin-log文件
  • 在误删数据之后可以通过bin-log恢复数据
  • binlog里的内容不具备可读性,所以需要我们自己去判断恢复的逻辑点位,怎么观察呢?看重点信息,比如begin,commit这种关键词信息,只要在binlog当中看到了,你就可以理解为begin-commit之间的信息是一个完整的事务逻辑,然后再根据位置position判断恢复