目录
MySQL体系结构
一、MySQL的Server层有七个组件
1、MySQL 向外提供的交互接口(Connectors)
2、连接池组件(Connection Pool)
3、管理服务组件和工具组件(Management Service & Utilities)
4、SQL 接口组件(SQL Interface)
5、查询分析器组件(Parser)
6、优化器组件(Optimizer)
7、查询缓存组件(Query Caches & Buffers)
二、MySQL存储引擎
三、工作流程
四、mysql主要文件
MySQL体系结构
MySQL 可以分为 Server 层和存储引擎层两部分。
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。从 MySQL 5.5.5 版本开始InnoDB成为了默认存储引擎。同存储引擎的表数据存取方式不同,支持的功能也不同。
一、MySQL的Server层有七个组件
1、MySQL 向外提供的交互接口(Connectors)
connections组件是mysql向外提供的交互组件,可以通过该组件来操作mysql语句,实现交互,建立连接之后,可以通过 show processlist,语句查看已经建立的连接。
(root@localhost) [(none)]> show PROCESSLIST;
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 20864 | Waiting on empty queue | NULL |
| 8 | root | localhost | NULL | Query | 0 | starting | show PROCESSLIST |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
连接之后,如果太长时间没有动静,连接器就会自动断开,默认8小时
(root@localhost) [(none)]> show variables like '%timeout%';
+-----------------------------------+----------+
| Variable_name | Value |
+-----------------------------------+----------+| interactive_timeout | 28800 | 服务器关闭交互式连接前等待活动的秒数| wait_timeout | 28800 | 服务器关闭非交互连接之前等待活动的秒数
+-----------------------------------+----------+
当只改wait_timeout 是不能改interactive_timeout的,wait_timeout是修改session变量,是不起作用的,当关闭此次会话,退出mysql ,重新登录发现还是原来的值:但若只改interactive_timeout,wait_timeout也会跟着改。所以修改global的interactive_timeout参数,可以真正调整超时时间。
linux的服务器上的mysql:
set global interactive_timeout=31536000;
show VARIABLES like ‘%timeout%’;
2、连接池组件(Connection Pool)
负责监听客户端向mysql服务器端的各种请求,接收请求,转发请求,到目标模块,每个成功连接mysql的客户端请求都会被创建或分配一个线层,该线程负责客户端与mysql服务器端的通信,接收客户端的命令,传递服务器端的结果信息等。
3、管理服务组件和工具组件(Management Service & Utilities)
提供对MySOL的集成管理,如备份(Backup)、恢复(Recovery)、安全管理(Security)等。
4、SQL 接口组件(SQL Interface)
接收用户SQL命令,如DML、DDL和存储过程等,并将最终结果返回给用户。
5、查询分析器组件(Parser)
系统在执行输入语句之前,必须分析出语句想要干什么。例如:首先通过select关键字得知这是一条查询命令,还包括分析要查询的是哪张表以及查询条件是什么。同时,分析器必须分析输入语句的语法正确性。
6、优化器组件(Optimizer)
优化器是MySQL用来对输人语句在执行之前所做的最后一步优化。优化内容包括:是否选择索引、选择哪个索引、多表查询的联合顺序等。每一种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一种方案。
7、查询缓存组件(Query Caches & Buffers)
在每一次查询时,MySQL 都先去看看是否命中缓存,命中则直接返回,提高了系统的响应速度。但是这个功能有一个相当大的弊病,那就是一旦这个表中数据发生更改,那么这张表对应的所有缓存都会失效。
二、MySQL存储引擎
mysql存储引擎负责数据的存储和提取,架构模式是插件式的。支持innoDB等多个存储引擎。
查看当前支持的存储引擎
(root@localhost) [test]> show engines;
InnoDB 存储引擎
InnoDB是MySQL的默认存储引擎,它支持ACID(原子性、一致性、隔离性和持久性)事务,并提供了行级锁定、外键约束和崩溃恢复等功能。它适用于大多数应用场景,特别是需要事务支持和高并发读写操作的应用。
特性:
- 事务支持:InnoDB引擎支持事务的ACID属性,确保了数据的原子性、一致性、隔离性和持久性。这意味着可以使用BEGIN、COMMIT和ROLLBACK语句来管理事务,保证数据的完整性和一致性。
- 行级锁定:InnoDB使用行级锁来处理并发访问和修改数据,而不是表级锁。这意味着多个事务可以同时访问同一表的不同行,提高了并发性能和并发控制。
- 外键约束:InnoDB支持外键约束,可以在数据库层面实现数据的一致性和完整性。它提供了CASCADE、RESTRICT和SET NULL等选项来处理外键关系。
- 崩溃恢复:InnoDB具有崩溃恢复的能力,即使在系统崩溃或电源故障的情况下,也可以保证数据的完整性。它通过事务日志(redo log)来恢复未完成的事务和恢复已提交的事务。
- 自动增长列:InnoDB支持自动增长列,可以为表中的某一列指定自动递增的整数值,简化了数据插入操作。
- 回滚段:InnoDB通过回滚段(Rollback Segment)来存储未提交事务的数据,以便在需要时进行回滚操作。
- 可以在线热备份:InnoDB引擎支持在线热备份,可以在不停止MySQL服务器的情况下备份数据库。
- 支持MVCC(多版本并发控制):InnoDB使用多版本并发控制来处理并发事务,在读操作的同时允许写操作,并通过行版本来实现数据的隔离性和一致性。
- 高性能:InnoDB引擎通过使用缓冲池(Buffer Pool)来缓存热门数据和索引,提高读取数据的性能。
三、工作流程
四、mysql主要文件
1、数据库配置文件 my.cnf
2、表结构定义文件
每创建一张表都会有一个frm后缀的文件,就是表结构的定义文件。show create table user\G
如果没有连接mysql。可以使用 mysqlfrm工具 可以解析 frm结尾的文件
mysqlfrm --diagnostic
3、错误文件 mysql.err
(root@localhost) [mysql]> SHOW VARIABLES LIKE 'log_error';
+---------------+---------------------+
| Variable_name | Value |
+---------------+---------------------+
| log_error | /var/log/mysqld.log |
+---------------+---------------------+
4、慢查询日志文件 slow_log
将运行超过某个时间阈值的sql语句记录到文件
MySQL5.1开始可以以毫秒为单位记录运行的sql
MySQL5.5开始可以将慢查询保存到表
mysql5.7 将时区信息写入到查询日志
慢查询相关参数:
1、slow_query_log = on //是否开启慢查询
2、slow_query_log_file = slow.log //慢查询日志文件名
3、long_query_time = 3 //指定慢查询的阈值
4、min_examined_row_limit = 100 //扫描行数少于该值的sql不记录到慢查询日志
5、log_queries_not_using_indexes //将没有使用索引的sql记录到慢查询日志
6、log_throttle_querles_not_using_indexes //限制每分钟记录没有使用索引sql语句的次数
7、log_output = FILE //慢查询日志的格式 file、table、none//默认是 FILE 文件格式,也可以保存到表中,在mysql 这个库里边 slow_log 、general_log//就是说 将log_output 设置为table 的话,就会保存在slow_log这张表里。set global log_output = table;
8、log_slow_slave_statements://在从服务器上开启慢查询
9、log_timestamps = system //写入时区信息
//在 my.cnf配置文件添加完之后 重启mysql数据库生效
(root@localhost) [mysql]> show variables like 'slow%';
+---------------------+------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------+
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/rabbitmq_1-slow.log |
+---------------------+------------------------------------+
// select sleep(10);测试
//也可以在库中直接修改
(root@localhost) [mysql]> set global slow_query_log = 1;
(root@localhost) [mysql]> set global slow_query_log_file = slow.log
(root@localhost) [mysql]> set global long_query_time =2;
//如果这个日志文件特别大,怎么在线删除?
1、先把slow.log备份一下,但是备份完之后,日志还是会写进这个文件,
2、需要 刷新下 flush slow logs
3、这时候会关闭之前的日志文件,会重新写入一个slow日志
测试慢查询:
有些时候,sql执行时间过长但是并没有记录到慢查询日志中去
比如:
(root@localhost) [mysql]> create database test;Query OK, 1 row affected (10.00 sec)
(root@localhost) [mysql]> use test;
Database changed
(root@localhost) [test]> create table a (a int primary key,b int);
Query OK, 0 rows affected (0.02 sec)
(root@localhost) [test]> select * from a where a =1;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
+---+------+
1 row in set (0.00 sec)
//加锁
(root@localhost) [test]> begin;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [test]> select * from a where a =1 for update;
(root@localhost) [test]> commit;//然后在开一个会话,执行下update操作,就会发现 此时执行的sql一直在等待。在上一个会话中,执行commit 之后,这条sql才会被执行
(root@localhost) [test]> begin;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [test]> update a set b = b+1 where a =1;
Query OK, 1 row affected (7.84 sec)
Rows matched: 1 Changed: 1 Warnings: 0
//可以发现这个sql执行了7秒中,但是这条sql不会记录到慢查询日志中去,
因为slow_log 记录时间是按照 Query_time - Lock_time 的时间计算的 所以说等待时间和缩短时间 是不考虑的
5、通用日志 general_log
使用场景:可以看一些原理,比如备份,使用mysqldump 或者其他命令执行备份之后,他是怎么一步步操作的,可以打开记录日志功能,能看到详细的信息
0:关闭
1:打开
[mysqld]
general_log = 1
general_log_file = general.log
1、可以记录数据库相关操作
参数:general_log
默认文件名:机器名.log
2、同样可以将日志保存到表中,mysql.general.log
3、开启之后性能下降明显