mysq(一): mysql架构图

1.mysql架构图

mysq(一): mysql架构图_第1张图片
1.第一层:对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。

mysql如果一直保持连接状态,mysql会把内存吃满,此时可以使用两种方案:
(1)断开一段时间后重连
(2)通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

2.第二层:MySQL的核心服务功能层,包括查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select操作会先检查是否命中查询缓存,命中则直接返回缓存数据,否则解析查询并创建对应的解析树。如下图,解析器会将命令分类为select、dml、ddl、rep、status五个模块的内容将给不同的模块去处理。
mysq(一): mysql架构图_第2张图片
查询优化器的策略

  • 它使用的是 “选取-投影-联接” 策略进行查询。
    用一个例子就可以理解: select uid,name from user where gender = 1;
    • 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行过滤
    • 这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
    • 将这两个查询条件联接起来生成最终查询结果

查询缓存往往弊大于利:因为mysql中的数据经常变化,所以使用缓存的命中率很低,mysql8删除了该功能。

3.第三层:存储引擎,负责数据的存储和提取,MySQL服务器通过API与存储引擎通信,屏蔽了各种引擎之间的差异,常见的存储引擎有:InnoDB、MyISAM。

MySQL 5.5之后,默认的存储引擎由MyISAM变为InnoDB。

- Innodb Myisam
存储文件 (1) .frm 表定义文件(2) .ibd 数据文件 (1).frm 表定义文(2).myd 数据文件(3).myi 索引文件
表锁、行锁 表锁
事务 ACID 不支持
CRDU 读、写 读多
count 扫表 专门存储的地方
索引结构 B+ Tree B+ Tree

2.文件日志

查看MySQL数据文件:SHOW VARIABLES LIKE '%datadir%';

  • .frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息
  • .ibd和.ibdata文件:用来存储InnoDB存储引擎表数据索引信息
  • .myd文件:主要用来存储使用MyISAM存储引擎表数据信息
  • .myi文件:主要用来存储使用MyISAM存储引擎的表数据文件中任何索引的数据树

日志文件:
MySQL通过日志记录了数据库操作信息和错误信息。常用的日志文件包括错误日志、二进制日志、查询日志、慢查询日志和 InnoDB 引擎在线 Redo 日志、中继日志等。

(1)错误日志(err log):

  • 默认是开启的,而且从5.5.7以后无法关闭错误日志
  • 记录了运行过程中遇到的所有严重的错误信息,以及 MySQL每次启动和关闭的详细信息。

(2) 二进制日志(bin log):

  • 默认是关闭的,需要通过配置:log-bin=mysql-bin进行开启。其中mysql-bin是binlog日志文件的basename,binlog日志文件的名称:mysql-bin-000001.log
  • binlog记录了数据库所有的ddl语句和dml语句,但不包括select语句内容,语句以事件的形式保存,描述了数据的变更顺序,binlog还包括了每个更新语句的执行时间信息,binlog主要作用是用于恢复数据,因此binlog对于灾难恢复和备份恢复来说至关重要。
  • 如果是DDL语句,则直接记录到binlog日志,而DML语句,必须通过事务提交才能记录到binlog日志中。
  • binlog还用于实现mysql主从复制。
  • binlog还用于数据恢复。

(3)通用查询日志(general query log):

  • 默认情况下通用查询日志是关闭的。
  • 由于通用查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的如若不是为了调试数据库的目的建议不要开启查询日志

(4)慢查询日志(slow query log):

  • 默认是关闭的。需要通过设置:slow_query_log=ON进行开启。
  • 记录执行时间超过long_query_time秒的所有查询,便于收集查询时间比较长的SQL语句

(5)事务日志:

  • 事务日志(InnoDB特有的日志)也叫redo日志。
  • 文件名为"ib_logfile0"和“ib_logfile1”,默认存放在表空间所在目录。
  • 还有一个日志文件叫undo 日志,默认存储在ib_data目录下。

(6)中继日志:

  • 是在主从复制环境中产生的日志。
  • 主要作用是为了从机可以从中继日志中获取到主机同步过来的SQL语句,然后执行到从机中。

参考文献:
https://www.jianshu.com/p/c1a23c1b282c
https://www.cnblogs.com/lay2017/p/9165203.html

你可能感兴趣的:(mysql)