每天早上七点三十,准时推送干货
大家都知道,对于面试官来说,没有办法能够很直接的能问到面试者对于SQL的理解,所以就会有很多千奇百怪的问题就出现了,比如 SQL 优化,索引创建原则,索引的最左匹配原则,唯一索引,联合索引,甚至就开始询问关于 MySQL 的存储引擎了。
MYSQL 的存储引擎
首先我们得先知道存储引擎是什么,
百度百科是这么解释的:
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
阿粉不知道最近很火的 ChatGTP 是如何解释这个存储引擎的,但是在阿粉看来,他就是 MySQL将数据存储在文件系统中的存储方式或者存储格式
又或者说,存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式 。存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型。
也就是说,在一个数据库中的多个表可以有不同的存储引擎,这样面试官再问的时候,可别说不可以。
既然我们知道了 MYSQL 的存储引擎是什么了,那么就得来说说他的分类了。
MYSQL 存储引擎分类:
- InnoDB、
- MyISAM、
- MEMORY、
- CSV、
- BLACKHOLE、
- FEDERATED、
- MRG_MYISAM、
- ARCHIVE、
- PERFORMANCE_SCHEMA。
这么一看的话,MYSQL 的存储引擎那分类也是很多样的,这样阿粉接下来就详细的拆开,一个一个的说说他的存储引擎,只讲用的比较多的,其他的只做简单了解就OK了,比较,如果要是你能和面试官就一两个存储引擎聊的非常透彻的话,那么相信你也入职也没啥问题。
InnoDB 存储引擎
首先第一点,mysql5.6 以上默认存储方式就是使用的 InnoDB存储引擎,而 InnoDB 存储引擎的各方面的优点也是非常多的,例如:
用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性, 数据操作除了插入和查询之外,还包括很多更新和删除操作,那么 InnoDB 存储引擎是比较合适的。
InnoDB 除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚, 对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。
InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。
我们也是可以通过 SQL 来查询当前数据库默认的存储引擎的,SQL 语句如下:
代码语言:javascript复制show variables like '%engine%';
上述语句是查询默认使用的存储引擎,而查询当前 MYSQL 支持的存储引擎则是使用下面的语句:
代码语言:javascript复制show engines;
既然我们已经都知道了关于这个 InnoDB 的相关特点了,那么接下来我们还得来看看这个关于 InnoDB 存储引擎的磁盘结构。
InnoDB磁盘主要包含Tablespaces,InnoDB Data Dictionary,Doublewrite Buffer、Redo Log 和Undo Logs。
Tablespaces:system表空间是InnoDB数据字典、doublewrite缓冲区、change缓冲区和undo日志的存储区域。如果表是在系统表空间中创建的,而不是在每个表的文件或一般表空间中创建的话,它还可以包含表和索引数据。
InnoDB Data Dictionary:InnoDB数据字典由内部系统表组成,其中包含用于跟踪表、索引和表列等对象的元数据。元数据物理上位于InnoDB系统表空间中。由于历史原因,数据字典元数据与InnoDB表元数据文件(.frm文件)中的信息存在一定程度的重叠。
Doublewrite Buffer:doublewrite缓冲区是一个存储区域,InnoDB在将页面写到InnoDB数据文件中的适当位置之前,在这个存储区域中写入从缓冲池中刷新的页面。如果在页写过程中出现了操作系统、存储子系统或意外的mysqld进程退出,InnoDB可以在崩溃恢复期间从doublewrite缓冲区中找到一个好的页副本。
Redo Log:重做日志是一种基于磁盘的数据结构,在崩溃恢复期间用于纠正不完整事务写入的数据。在正常操作过程中,重做日志对SQL语句或低级API调用产生的表数据更改请求进行编码。在意外关闭之前未完成数据文件更新的修改将在初始化期间和接受连接之前自动重播。有关重做日志在崩溃恢复中的角色的信息。
Undo Logs:撤消日志是与单个读写事务相关联的撤消日志记录的集合。撤销日志记录包含关于如何撤销事务对聚集索引记录的最新更改的信息。如果另一个事务需要将原始数据作为一致读操作的一部分来查看,则从撤消日志记录中检索未修改的数据。Undo日志存在于Undo日志段中,包含在回滚段中。回滚段位于系统表空间、undo表空间和临时表空间中。
下面是阿粉找的硬盘结构图:
关于 InnoDB 引擎,其实我们最主要掌握的就是他的一系列的特点,下面则是他的优点:
它的DML操作遵循ACID(atomicity原子,consistency一致,isolation隔离,durability持久)模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据。
并发性能好:行级锁定和oracle风格的一致读取可以提高多用户并发性和性能。
查询性能好:InnoDB表在磁盘上排列数据,以优化基于主键的查询。每个InnoDB表都有一个主键索引,称为聚集索引,用于组织数据以最小化主键查找的I/O。
业务性能好:为了保持数据的完整性,InnoDB支持外键约束。使用外键,插入、更新和删除将被检查,以确保它们不会导致相关表之间的不一致。有些生产环境不使用外键,以业务代码维护表数据间关系。
一般对于 InnoDB 掌握这些差不多也算是能应对面试官的提问了,今天阿粉就先讲到这里,之后继续讲解关于 MySQL 的其他的存储引擎。