1.mysql架构图

1.第一层:对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。
mysql如果一直保持连接状态,mysql会把内存吃满,此时可以使用两种方案:
(1)断开一段时间后重连
(2)通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
2.第二层:MySQL的核心服务功能层,包括查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select操作会先检查是否命中查询缓存,命中则直接返回缓存数据,否则解析查询并创建对应的解析树。如下图,解析器会将命令分类为select、dml、ddl、rep、status五个模块的内容将给不同的模块去处理。
查询优化器的策略:
- 它使用的是 “选取-投影-联接” 策略进行查询。
用一个例子就可以理解: 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