服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL的InnoDB引擎原来是这样的

MySQL的InnoDB引擎原来是这样的

2022-12-14 17:30Java极客技术鸭血粉丝Tang Mysql

mysql5.6 以上默认存储方式就是使用的 InnoDB存储引擎,而 InnoDB 存储引擎的各方面的优点也是非常多的,例如:用于事务处理应用程序,支持外键和行级锁。

大家都知道,对于面试官来说,没有办法能够很直接的能问到面试者对于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 语句如下:

show variables like '%engine%';

上述语句是查询默认使用的存储引擎,而查询当前 MYSQL 支持的存储引擎则是使用下面的语句:

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表空间和临时表空间中。

下面是阿粉找的硬盘结构图:

MySQL的InnoDB引擎原来是这样的

关于 InnoDB 引擎,其实我们最主要掌握的就是他的一系列的特点,下面则是他的优点:

它的DML操作遵循ACID(atomicity原子,consistency一致,isolation隔离,durability持久)模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据。

并发性能好:行级锁定和oracle风格的一致读取可以提高多用户并发性和性能。

查询性能好:InnoDB表在磁盘上排列数据,以优化基于主键的查询。每个InnoDB表都有一个主键索引,称为聚集索引,用于组织数据以最小化主键查找的I/O。

业务性能好:为了保持数据的完整性,InnoDB支持外键约束。使用外键,插入、更新和删除将被检查,以确保它们不会导致相关表之间的不一致。有些生产环境不使用外键,以业务代码维护表数据间关系。

一般对于 InnoDB 掌握这些差不多也算是能应对面试官的提问了,今天阿粉就先讲到这里,之后继续讲解关于 MySQL 的其他的存储引擎。

原文地址:https://mp.weixin.qq.com/s/s2c9L2p5kGC_InjorgDRnQ

延伸 · 阅读

精彩推荐
  • MysqlMySQL子查询操作实例详解

    MySQL子查询操作实例详解

    这篇文章主要介绍了MySQL子查询操作,结合实例形式较为详细的分析了mysql表的创建、常见子查询运算与关键字使用技巧,需要的朋友可以参考下...

    程志伟3132019-07-07
  • MysqlMySQL一劳永逸永久支持输入中文的方法实例

    MySQL一劳永逸永久支持输入中文的方法实例

    相信大家在使用MySQL数据库的过程中,或多或少都遇到报错,下面这篇文章主要给大家介绍了关于MySQL一劳永逸永久支持输入中文的相关资料,文中通过图文介绍...

    大本钟下送快递4172022-08-03
  • Mysqlmysql5.5数据库data目录迁移方法详解

    mysql5.5数据库data目录迁移方法详解

    这篇文章主要介绍了mysql5.5数据库data目录迁移方法详解,其实数据库的目录就在你安装目录的data里面,我的实在D盘。可能大家默认安装都在C吧。这样就要迁...

    MYSQL教程网2982020-06-04
  • MysqlWin7 64位 mysql 5.7下载安装常见问题小结

    Win7 64位 mysql 5.7下载安装常见问题小结

    这篇文章主要介绍了Win7 64位 mysql 5.7下载安装常见问题小结,本文图文并茂给大家介绍的非常详细,需要的朋友参考下吧 ...

    梦开始的地方--心5552020-08-01
  • Mysqlmysql5.7.17压缩包安装配置方法图文教程

    mysql5.7.17压缩包安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.17压缩包安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    AtTopers3272020-08-20
  • MysqlMySQL自增主键为何不是连续的呢?

    MySQL自增主键为何不是连续的呢?

    众所周知,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,大量的随机IO。自增主键不连续。...

    小龙coding5822021-09-28
  • MysqlMySQL8新特性:自增主键的持久化详解

    MySQL8新特性:自增主键的持久化详解

    MySQL8.0 GA版本发布了,展现了众多新特性,下面这篇文章主要给大家介绍了关于MySQL8新特性:自增主键的持久化的相关资料,文中通过示例代码介绍的非常...

    iVictor4412019-07-04
  • MysqlMysql中复制详细解析

    Mysql中复制详细解析

    这篇文章主要介绍了Mysql中复制详细解析,从基本概念、用途、实现方法以及集中模式进行了介绍,然后分享了具体实现代码,具有一定参考价值,需要的...

    潇潇、寒3412020-08-18