mysql基础架构和执行流程

93 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情

MySQL体系架构

image.png

MySQL Server架构自顶向下大致可以分网络连接层服务层存储引擎层系统文件层

服务层(MySQL Server)

主要由下面几部分构成:

  • 连接器:  身份认证和权限相关(登录 MySQL 的时候)。
  • 查询缓存:  执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。
  • 分析器:  没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
  • 优化器:  按照 MySQL 认为最优的方案去执行。
  • 执行器:  执行语句,然后从存储引擎返回数据。 执行语句之前会先判断是否有权限,如果没有权限的话,就会报错。
  • 插件式存储引擎 : 主要负责数据的存储和读取,采用的是插件式架构,支持 InnoDB、MyISAM、Memory 等多种存储引擎。

SQL语句执行流程:

1.当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。

2.在正式查询之前,服务器会检查查询缓存,如果能找到对应的查询,则不必进行查询解析,优化,执行等过程,直接返回缓存中的结果集。

3.MySQL的解析器会根据查询语句,构造出一个解析树,主要用于根据语法规则来验证语句是否正确,比如SQL的关键字是否正确,关键字的顺序是否正确。

而预处理器主要是进一步校验,比如表名,字段名是否正确等。

4.查询优化器将解析树转化为查询计划,一般情况下,一条查询可以有很多种执行方式,最终返回相同的结果,优化器就是根据成本找到这其中最优的执行计划。

5.执行计划调用查询执行引擎,而查询引擎通过一系列API接口查询到数据。

6.得到数据之后,在返回给客户端的同时,会将数据存在查询缓存中。

image.png

MySQL 存储引擎

查看mysql版本: select version()

查看 MySQL 支持的所有存储引擎 show engines 

查看 MySQL 当前默认的存储引擎 show variables like '%storage_engine%' 

查看数据库中某个表使用的存储引擎 show table status from db_name where name='table_name'

MySQL 5.5.5 之前,MyISAM 是 MySQL 的默认存储引擎。MyISAM 不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。5.5.5 版本之后,InnoDB 是 MySQL 的默认存储引擎。

InnoDB和MyISAM对比

InnoDB和MyISAM是使用MySQL时最常用的两种引擎类型,来看下它们的区别:

  • 事务和外键

    InnoDB支持事务和外键,具有安全性和完整性,适合大量insertupdate操作。
    MyISAM不支持事务和外键,它提供高速存储和检索,适合大量的select查询操作。
    
  • 锁机制

    InnoDB支持行级锁,锁定指定记录。基于索引来加锁实现。 
    MyISAM支持表级锁,锁定整张表。
    
  • 索引结构

    InnoDB使用聚集索引(聚簇索引),索引和记录在一起存储,既缓存索引,也缓存记录。 
    MyISAM使用非聚集索引(非聚簇索引),索引和记录分开。
    
  • 并发处理能力

    InnoDB读写阻塞可以与隔离级别有关,可以采用多版本并发控制(MVCC)来支持高并发。
    MyISAM使用表锁,会导致写操作并发率低,读之间并不阻塞,读写阻塞。 
    
  • 存储文件

    InnoDB表对应两个文件,一个.frm表结构文件,一个.ibd数据文件。InnoDB表最大支持64TB; 
    MyISAM表对应三个文件,一个.frm表结构文件,一个MYD表数据文件,一个.MYI索引文件。从
    MySQL5.0开始默认限制是256TB。
    

适用场景

MyISAM

  • 不需要事务支持(不支持);
  • 并发相对较低(锁定机制问题);
  • 数据修改相对较少,以读为主;
  • 数据一致性要求不高。

InnoDB

  • 需要事务支持(具有较好的事务特性);
  • 行级锁定对高并发有很好的适应能力;
  • 数据更新较为频繁的场景;
  • 数据一致性要求较高;
  • 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO。