Mysql-架构和SQL执行顺序

引言

最近开始捡mysql了,主要从Mysql架构,索引,锁,事务,性能分析和优化几个方面写几篇博客,这篇从mysql架构开始

逻辑架构

这是mysql的逻辑架构图:
Mysql-架构和SQL执行顺序
主要可分为四大块,从底层开始,分别为:

  • 文件系统:
    所有的数据最终必须还是得存放在磁盘上
  • 可插拔存储引擎
    数据的读写操作都是存储引擎完成的,可以理解成操作磁盘数据的组件,常用的有InnoDB,MyISAM等
  • mysql服务器
    mysql server,用于处理客户端的请求,语句解析,查询优化,调用存储引擎返回结果集
  • mysql连接器
    主要用于与服务器产生连接,如mysql client, JDBC等等

当然重点在存储引擎mysql服务器这块,我们先介绍一下常用的存储引擎,然后分析mysql服务器的执行流程

存储引擎

作用:为MySql服务器提供接口操作文件系统
MySQL的存储引擎是针对表进行指定的。(engine=InnoDB\myisam),常见的存储引擎有InnoDB和MyISAM。
InnoDB
支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM
插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。
两者对比如下:
Mysql-架构和SQL执行顺序

MySql服务器

MySql服务器包括:
连接池:连接管理,权限管理
SQL接口:用于接受SQL:DML DDL
解析器:用于词法分析和语法分析:将SQL转化成语法树,然后验证SQL语法是否正确
查询优化器:用于优化SQL:生成执行计划,选择索引
查询缓存:把SQL之后的hash和执行后的结果集保存,同一个SQL走缓存,不用再查询一次(这个在MySql8后取消了)


一条SQL在服务器中的流程如下:
Mysql-架构和SQL执行顺序
比如SQL:select a.name ,b.course_name from student a left join course b on a.course_id = b.id
在解析器和查询优化器优化处理后,真实的执行顺序就是:

1 – FROM <left_table>
2 – ON <join_condition>
3 – <join_type> JOIN <right_table> 第二步和第三步会循环执行
4 – WHERE <where_condition> 第四步会循环执行,多条件执行顺序从左往右
5 – GROUP BY <group_by_list>
6 – HAVING <having_condition>
7 – SELECT 分组之后才会执行SELECT
8 – DISTINCT <select_list>
9 – ORDER BY <order_by_condition>
10 LIMIT <limit_number> 前9步都是SQL92标准语法 limit是MySQL的独有的

物理结构

Mysql的所有数据,索引最终都是存储在文件系统上的(SHOW VARIABLES LIKE ‘%datadir%’; 可以查看文件存储目录),如图:
Mysql-架构和SQL执行顺序
首先进入/var/lib/mysql目录,里面存放的是
ibdata文件(使用共享表空间存储表数据和索引信息,所有表共同使用一个或者多个ibdata文件,重启一次生成一个)
以及各个database,然后进入test这个目录:
.frm:主要存放与表相关的数据信息,主要包括表结构的定义信息
.ibd:使用独享表空间存储表数据和索引信息,一张表对应一个ibd文件