当前位置: 首页 > 科技观察

MySQL的InnoDB引擎以前是这样的_0

时间:2023-03-12 20:05:34 科技观察

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