持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
MySQL体系架构
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.得到数据之后,在返回给客户端的同时,会将数据存在查询缓存中。
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支持事务和外键,具有安全性和完整性,适合大量insert或update操作。 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。