Mysql体系结构及sql执行过程总结
一、体系结构图
各模块说明:
1.Connectors:各应用程序与SQL的交互
2.Management Serveices & Utilities:系统管理和控制工具
3.Connection Pool:连接池
管理缓冲用户连接,线程处理等需要缓存的需求
4.SQL Interfaces:SQL接口
接受用户的SQL命令,并且返回用户需要查询的结果。例如select from就是调用SQL Interface
5.Parser:解析器
(1)将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的
(2)如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
6.Optimizer:查询优化器
SQL语句在查询之前会使用查询优化器对查询进行优化,使用的是“选取-投影-联接”策略进行查询。
例如:select uid,name from user where gender = 1;
这个select查询先根据where语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
将这两个查询条件联接起来生成最终查询结果
7.Cache&Buffer:查询缓存
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
8.Engine:存储引擎
存储引擎是MySql中具体的与文件打交道的子系统。
二、各个存储引擎介绍
1.myisam存储引擎:不支持事务、表级锁、全文索引,其中.myd文件存放数据文件,.myi文件存放索引文件,.frm文件存放表结构定义信息
2.innodb存储引擎:支持事务、行级锁、支持外键,其中.frm文件存放表结构定义信息,.ibd文件存放表的数据和索引、mysql5.6默认使用独立表空间
可以使用命令查看:
mysql> SHOW VARIABLES LIKE "innodb_file_per_table";
3.ndb存储引擎:集群存储引擎,share nothing,可提高可用性
4.memory存储引擎:数据存放在内存中,表锁,并发性能差,默认使用哈希索引
5.archive存储引擎:只支持insert和select zlib算法压缩1:10,适合存储归档数据如日志等、行锁
6.maria存储引擎:目的取代myisam、缓存数据和索引、行锁、mvcc
7.blackhole存储引擎:不保存任何写入的数据,常用于binlog转储
三、mysql物理文件组成
1.日志文件
1)错误日志
存放路径:默认保存在数据目录下以.err文件命名
日志功能:记录服务运行过程中所有较为严重的警告和错误信息,以及每次启动和关闭的详细信息。
2)二进制日志:
存放路径:默认保存在数据目录下,由于二进制日志极为重要,通常不和数据一起存放,需另外定义存放目录,通过修改配置文件my.cnf,例如:
log-bin = /home/logs/mysql/master-bin
日志功能:记录数据库的所有改变信息,用于数据库同步及即时点恢复。
2.数据文件
每创建一个库都会在数据目录下生产相应的目录文件
1).frm文件
存放路径:所属数据库的目录文件夹下
记录信息:与表相关的元数据(meta)信息、表结构的定义信息
属性:每个存储引擎都有该文件
2).MYD文件
存放路径:所属数据库的目录文件夹下
记录信息:存放MyISAM表的数据
属性:MyISAM存储引擎专用
3).MYI文件
存放路径:所属数据库的目录文件夹下
记录信息:存放MyISAM表索引相关信息
属性:MyISAM存储引擎专用
4).ibd文件
存放路径:所属数据库的目录文件夹下
记录信息:存放innodb表数据和索引
属性:innodb存储引擎专用
3.Replication相关文件
主从复制下存在的文件
1)master.info文件
存放路径:Slave端的数据目录下
记录信息:该Slave的Master端的相关信息
2)relay log
存放路径:Slave端的数据目录下
记录信息:存放Slave端的I/O线程从Master端所读取到的Binary Log信息
3)relay-log.info文件
存放路径:Slave端的数据目录下
记录信息:存放通过Slave的I/O线程写入到本地的relay log的相关信息
四、mysql执行过程
1.初始化模块
在服务启动的时候,做初始化操作,包含buffer、cache结构的初始化和内存空间的申请,系统变量的初始化设定,存储引擎初始化设置等。
2.连接管理模块
系统初始化结束后,连接管理模块启动监听程序,准备接受客户端的请求;
当一个客户端通过网络连接到MySQL服务器时,连接管理模块会监听到这个请求,通过MySQL自己定义的协议,执行相关的底层任务后,连接管理模块将请求转发给线程管理;
3.连接进程模块
线程管理会提供一个连接线程来处理请求连接,如果线程缓存(Thread Cache)中有空闲的连接线程,那么就会从线程缓存中直接取一个连接线程,否则新创建一个连接线程;
4.用户模块
连接线程会调用用户模块,进行授权检查,验证用户访问的合法性(用户是否有权访问数据库服务器,用户密码是否正确等),一旦验证通过就开始处理请求
5.命令分发器(即sql接口)
接受用户的sql命令,对于命令不需要调用Parse就可以直接执行
对于Query,需要进行Query解析和转发模块的解析,在Query解析器进行分析,如果是一个SELECT类型的Query,则调用查询缓存(Query Cache),检查是否存在相同的查询语句,如果存在则直接将cache中的数据返回,如果不存在或者不是SELECT类型的Query,则将此Query返回解析器。
6.命令解析器
如果是SELECT类型,解析器会将控制权交给查询优化器,
如果是DML或DDL语句,则会交给表变更管理模块,
如果是一些更新统计信息,检测,修复和整理类的Query,则会交给表变更管理模块
如果是请求系统状态类的,则会交给状态模块
7.访问控制模块
以上各个模块在收到Query解析与分发模块分发过来的请求后,首先会通过访问控制模块检查连接用户是否有访问目标表和目标字段的权限,如果有相关权限,就会调用表管理模块请求相应的表,并获取相应的锁。
8.表管理模块
在打开表后,根据表的相关meta信息,判断表的存储引擎类型和相关信息。
根据表的存储引擎类型,提交请求给存储引擎接口,调用对应的存储引擎实现模块进行处理。
当一条query或者一个command处理完成之后,控制权交还给连接线程模块。如果处理成功,则将处理结果通过连接线程反馈给客户端。如果处理过程发生错误,也会将相应的错误信息发送给客户端,然后连接线程模块会进行相应的清理工作,并继续等待后面的请求。