要了解mysql的运行机制,那么首先要对mysql的体系结构有一定的了解。
最近由于一些事,被打击的不轻,感觉自己可能再怎么努力,职业生涯也就这样了。所以对专研技术、写博客突然丧失了原来的激情。
但不管怎样,路是自己选的,哭着也要走完。何况,目前好像也没有其他路可走。
mysql体系结构
由图,可以看出MySQL由一下几部分组成:
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器组件
- 缓冲(Cache)组件
- 插件式存储引擎
- 物理文件
说明:
MySql数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。
需要注意:
存储引擎是基于表的,而不是基于数据库。
基于这样的特性,针对在项目中的业务数据库,大部分由于需要支持事务属性,所以采用的使用InnoDB存储引擎。但是针对那些只读特性的表,我们可以考虑使用MyISAM存储引擎,这样并不会破坏数据库的事务特性。
详细说明
最上层是连接组件。下面服务器是由连接池、管理工具和服务、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。
连接池:由于每次建立建立需要消耗很多时间,连接池的作用就是将这些连接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。
管理工具和服务:系统管理和控制工具,例如备份恢复、Mysql复制、集群等
SQL接口:接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
查询解析器: SQL命令传递到解析器的时候会被解析器验证和解析(权限、语法结构)
主要功能:
a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
查询优化器:查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是**“选取-投影-联接”**策略进行查询。
用一个例子就可以理解: select uid,name from user where gender = 1;
这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
将这两个查询条件联接起来生成最终查询结果。
此外查询优化器还能控制一个sql语句查询具体走哪一个索引,自动调整sql语句中where条件的顺序,来满足复合索引最左匹配原则的规则。
缓存器: 查询缓存(MySQL 8.0 版本后移除),如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
MySQL 查询不建议使用缓存,因为查询缓存失效在实际业务场景中可能会非常频繁,假如你对一个表更新的话,这个表上的所有的查询缓存都会被清空。
所以,一般在大多数情况下我们都是不推荐去使用查询缓存的。
MySQL 8.0 版本后删除了缓存的功能,官方也是认为该功能在实际的应用场景比较少,所以干脆直接删掉了。
插入式存储引擎 :存储引擎说白了就是如何管理操作数据(存储数据、如何更新、查询数据等)的一种方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)
物理文件:
物理文件包括:日志文件,数据文件,配置文件,pid文件,socket文件等
一个查询语句的执行流程
说了以上这么多,那么究竟一条 sql 语句是如何执行的呢?其实我们的 sql 可以分为两种,一种是查询,一种是更新(增加,更新,删除)。我们先分析下查询语句,语句如下:
select * from tb_student A where A.age='18' and A.name=' 张三 ';
结合上面的说明,我们分析下这个语句的执行流程:
1、建立连接
2、调用sql接口
3、鉴权:先检查该语句是否有权限,如果没有权限,直接返回错误信息
4、缓存判断:如果有权限,在 MySQL8.0 版本以前,会先查询缓存,以这条 sql 语句为 key 在内存中查询是否有结果,如果有直接缓存,如果没有,执行下一步。
5、解析sql语句:
通过分析器进行词法分析,提取 sql 语句的关键元素,比如提取上面这个语句是查询 select,提取需要查询的表名为 tb_student,需要查询所有的列,查询条件是这个表的 id=‘1’。然后判断这个 sql 语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。
6、查询优化对sql语句进行sql
接下来就是优化器进行确定执行方案,上面的 sql 语句,可以有两种执行方案:
a. 先查询学生表中姓名为“张三”的学生,然后判断是否年龄是 18。
b. 先找出学生中年龄 18 岁的学生,然后再查询姓名为“张三”的学生。
那么优化器根据自己的优化算法进行选择执行效率最好的一个方案(优化器认为,有时候不一定最好)。确认了执行计划后就准备开始执行了。
7、执行查询,返回结果
物理文件说明
1、日志文件
error log 错误日志 排错 /var/log/mysqld.log【默认开启】
bin log 二进制日志 备份 增量备份 DDL DML DCL
Relay log 中继日志 复制 接收 replication master
slow log 慢查询日志 调优 查询时间超过指定值
日志文件的默认位置:
Error Log
log-error=/var/log/mysqld.log
Binary Log
log-bin=/var/log/mysql-bin/bin.log
server-id=2 5.7.x版本后
Slow Query Log
slow_query_log=1|0
slow_query_log_file=/var/log/mysql-slow/slow.log
long_query_time=3
2、配置文件
/etc/my.cnf—>/etc/mysql/my.cnf—>/usr/etc/my.cnf—> ~/.my.cnf
如果冲突,以最后一个读取的为准
[mysqld]组中包括了mysqld服务启动时的初始化参数
[client]组中包含着客户端工具程序可以读取的参数,此外还有其他针对各个客户端软件的特定参数组等
3、数据文件
1、.frm文件
不论是什么存储引擎,每一个表都会有一个以表名命名的.frm文件,与表相关的元数据(meta)信息都存放在此文件中,包括表结构的定义信息等。
2、.MYD文件
myisam存储引擎专用,存放myisam表的数据(data)。每一个myisam表都会有一个.MYD文件与之呼应,同样存放在所属数据库的目录下
3、.MYI文件
也是myisam存储引擎专用,存放myisam表的索引相关信息。对于myisam存储引擎来说,可以被缓存(cache)的内容主要就是来源于.MYI文件中。
每一个myisam表对应一个.MYI文件,其存放的位置和.frm及.MYD一样
4、.ibd文件和ibdata文件
存放innoDB的数据文件(包括索引)。innoDB存储引擎有两种表空间方式:独享表空间和共享表空间。
独享表空间:使用.ibd文件来存放数据,且每个表一个.ibd文件,文件存放在和myisam数据相同的位置。
共享表空间:使用.ibdata文件,所有表共同使用一个(或多个,自行配置)ibdata文件。
ibdata1:系统表空间(数据文件)undo 段
ib_logfile0 redlog文件 一组
ib_logfile1
db.opt文件 此文件在每一个自建的库里都会有,记录这个库的默认使用的字符集和校验规。
4、pid文件
pid文件是mysqld应用程序在Unix/Linux环境下的一个进程文件,和许多其他Unix/Linux服务端程序一样,它存放着自己的进程id
5、socket文件
socket文件也是在Unix/Linux环境下才有的,用户在Unix/Linux环境下客户端连接可以不通过TCP/IP网络而直接使用Unix Socket来连接mysql.
区分数据库、数据库实例、数据库服务器
数据库(database):
操作系统或存储上的数据文件的集合。mysql数据库中,数据库文件可以是* .frm、.MYD、.MYI、*.ibd等结尾的文件,不同存储引擎文件类型不同。
更偏向文件的存储方面。
数据库实例(instance)
由后台进程或者线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。
需要注意:数据库实例才是真正操作数据库的。
更偏向应用操作方面。
数据库和数据库实例的关系:
通常情况下,数据库实例和数据库是一一对应的关系,也就是一个数据库实例对应一个数据库;
但是,在集群环境中存在多个数据库实例共同使用一个数据库。
比如一个数据库里面的表,经过分表策略,可以分散在多个数据库实例中。
数据库实例指的是数据库应用,数据库指的是在数据库实例上面创建的database。
比如在服务器上部署了一个3306端口的mysql应用,那么就是一个数据库实例;
如果继续部署一个3309的mysql应用,那么就是在一个服务上部署了2个msql的实例。
在3306端口的mysql实例上,创建一个名为order的database,就是创建了一个数据库。
数据库服务器(database server)
部署安装数据库实例的服务器。
总结
1、mysql体系结构,主要包括连接池组件、管理服务和工具组件
SQL接口组件、查询分析器组件、优化器组件、缓冲(Cache)组件、插件式存储引擎
物理文件。
2、分析一个查询语句的执行过程:建立连接—》权限校验—》查询缓存—》分析器—》优化器—》权限校验—》执行器—》引擎
3、区分数据库、数据库实例、数据库服务器
【开心一刻】
更多精彩,关注我吧。