Mysql-架构和SQL执行顺序
引言
最近开始捡mysql了,主要从Mysql架构,索引,锁,事务,性能分析和优化几个方面写几篇博客,这篇从mysql架构开始
逻辑架构
这是mysql的逻辑架构图:
主要可分为四大块,从底层开始,分别为:
- 文件系统:
所有的数据最终必须还是得存放在磁盘上 - 可插拔存储引擎
数据的读写操作都是存储引擎完成的,可以理解成操作磁盘数据的组件,常用的有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服务器
MySql服务器包括:
连接池:连接管理,权限管理
SQL接口:用于接受SQL:DML DDL
解析器:用于词法分析和语法分析:将SQL转化成语法树,然后验证SQL语法是否正确
查询优化器:用于优化SQL:生成执行计划,选择索引
查询缓存:把SQL之后的hash和执行后的结果集保存,同一个SQL走缓存,不用再查询一次(这个在MySql8后取消了)
一条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%’; 可以查看文件存储目录),如图:
首先进入/var/lib/mysql目录,里面存放的是
ibdata文件(使用共享表空间存储表数据和索引信息,所有表共同使用一个或者多个ibdata文件,重启一次生成一个)
以及各个database,然后进入test这个目录:
.frm:主要存放与表相关的数据信息,主要包括表结构的定义信息
.ibd:使用独享表空间存储表数据和索引信息,一张表对应一个ibd文件