mysql文档--默认存储引擎--innodb存储引擎--innodb引擎全解

news2024/11/25 12:39:39

阿丹:

        在mysql中innodb是默认的存储引擎。研究一下为什么它会被独宠。

官方解释:

        InnoDB,是MySQL的数据库引擎之一,现为MySQL的默认存储引擎,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。

InnoDB采用双轨制授权,一个是GPL授权,另一个是专有软件授权。

双轨制:

        双轨制授权指的是InnoDB采用的一种授权方式,它同时提供两种不同的授权方式,一种是GPL授权,另一种是专有软件授权。

        GPL授权是一种开源许可,它要求对源代码进行公开,并遵循相应的开源规定。在这种授权方式下,任何人都可以获取并使用InnoDB的源代码,对其进行修改和再发布。

        专有软件授权是一种封闭的授权方式,它不允许对源代码进行公开或修改。在这种授权方式下,InnoDB的源代码是封闭的,只有获得授权的人才可以获取和使用。

        双轨制授权的目的是为了满足不同用户的需求,有些用户可能更喜欢使用开源软件,有些用户则更喜欢使用封闭的软件。通过同时提供两种授权方式,InnoDB可以更好地满足不同用户的需求。        

简介:

InnoDB是一个支持ACID事务、行级锁定和高并发的事务型数据库引擎,它与MySQL服务器紧密集成。以下是有关InnoDB存储引擎的要点总结:

  1. 数据存储和索引:InnoDB将表和索引存储在一个表空间中,而不是像MyISAM表那样分别存储在不同的文件中。这个表空间可以由多个文件组成,并且在操作系统上没有2GB文件大小限制。

  2. 事务支持:InnoDB支持完整的事务处理,符合ACID(原子性、一致性、隔离性和持久性)属性。它允许在事务中包含多个SQL语句,并提供回滚和提交功能。

  3. 多版本并发控制:InnoDB使用多版本并发控制(MVCC)来处理并发访问,使得读取操作不会被写入操作所阻塞,提高了并发性能。

  4. 行级锁定:InnoDB支持行级锁定,这意味着只锁定需要修改的行,而不是锁定整个表或页面。行级锁定减少了锁冲突,允许更多并发操作。

  5. 外键约束支持:作为MySQL中第一个支持外键约束的引擎,InnoDB可以确保关联表之间的数据完整性,并执行级联操作(如级联删除和更新)。

  6. 缓冲池:InnoDB在内存中维护了一个专门的缓冲池,用于高速缓存数据和索引。这提高了数据的访问速度和整体性能。

  7. 可靠性:InnoDB具有崩溃恢复功能,它会将未完成的事务日志记录下来,并在数据库重新启动时进行恢复,保证数据的一致性。

  8. 可混合使用:InnoDB可以与其他MySQL表引擎混合使用。在一个查询中,你可以自由地将InnoDB表与其他类型的表混合,并实现复杂的查询操作。

innodb存储引擎底层知识--基础大纲:

InnoDB存储引擎的底层实现是基于B+树和聚簇索引的存储结构。

  1. 表空间(Tablespace):InnoDB存储引擎以表空间的形式存储数据。每个InnoDB数据库都由一个或多个数据文件组成的表空间来存储表和索引数据。

  2. 页(Page):InnoDB存储引擎将数据划分为固定大小的页(一般为16KB)。每个页都是独立的存储单元,包含表数据、索引数据和一些元数据信息。

  3. B+树索引:InnoDB使用B+树来组织和存储索引数据。B+树是一种高效的平衡搜索树,它通过在每个节点中保存多个关键字和指向子节点的指针来支持高效的数据查找。

  4. 聚簇索引(Clustered Index):InnoDB将每个表的主键索引与数据页合并成为一个聚簇索引。聚簇索引决定了数据在磁盘上的存储顺序,使得通过主键的查询变得非常高效。由于数据和索引在同一位置存储,聚簇索引还提供了较好的数据局部性,减少了磁盘IO的需求。

  5. 辅助索引(Secondary Index):除了聚簇索引外,InnoDB还支持辅助索引,也就是普通的非主键索引。辅助索引的叶子节点包含索引字段的值以及对应的主键值,通过主键值可以快速定位到相应的行数据。

补充:!!!!

Mysql--技术文档--索引-《索引为什么查找数据快?》-超底层详细说明索引_一单成的博客-CSDN博客

存储结构--B+树

Mysql--技术文档--B树-数据结构的认知_一单成的博客-CSDN博客

Mysql--技术文档--B+树-数据结构的认知_一单成的博客-CSDN博客

MVCC:

Mysql--技术文档--MVCC(Multi-Version Concurrency Control | 多版本并发控制)_一单成的博客-CSDN博客

总之,InnoDB是一个功能强大的存储引擎,专注于提供高性能、事务支持和并发控制。它的特点包括数据的可靠性、行级锁定、外键约束和多版本并发控制。由于这些优势,InnoDB成为处理大数据量和多用户并发操作的首选存储引擎。

MySQL

重要理解:

        mysql中innodb的控制并发就是结合了mvcc和乐观锁

Mysql--技术文档--悲观锁、乐观锁-《控制并发机制简单认知、深度理解》_一单成的博客-CSDN博客

        在MySQL的InnoDB存储引擎中,控制并发的机制是结合了MVCC(多版本并发控制)和乐观锁的思想。InnoDB使用MVCC来管理版本和数据一致性,并使用乐观锁来实现并发控制。

        MVCC机制通过使用事务ID、undolog指针和行ID等字段来跟踪和管理不同版本的数据。它为每个事务创建数据的版本,并通过版本号或时间戳来识别不同的数据版本,从而避免并发操作之间的冲突。

        乐观锁的思想在MVCC中起着重要的作用。当事务读取或修改数据时,并不会立即加锁,而是先获取数据的版本信息。事务在操作数据之前,会对版本信息进行验证,确保操作的是合适的数据版本。如果发现冲突,乐观锁会回滚事务或触发相应的冲突处理逻辑。

        结合了MVCC和乐观锁的机制,MySQL的InnoDB存储引擎能够提供较高的并发性能和数据一致性。读操作不需要加锁,事务之间可以并发执行,从而提高了系统的吞吐量。而在涉及写操作时,乐观锁会通过版本管理和验证来确保数据的一致性和隔离性。

        正因为InnoDB结合了MVCC和乐观锁的机制,使得MySQL在处理并发访问时能够提供高效而可靠的并发控制。

ACID事务

ACID是事务处理的四个关键属性的首字母缩写,指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。下面是对每个属性的解释:

  1. 原子性(Atomicity):事务是一个不可再分割的工作单元,要么全部执行成功,要么全部不执行,不会发生部分执行的情况。如果事务中的任何操作失败,系统将撤销已执行的操作,将数据库恢复到事务开始之前的状态。

  2. 一致性(Consistency):事务的执行将使数据库从一种一致状态转换为另一种一致状态。这意味着在事务执行结束后,数据库必须满足所有定义的规则、约束和完整性条件,以确保数据在逻辑上的正确性。

  3. 隔离性(Isolation):事务的隔离性确保并发执行的事务之间相互隔离,每个事务都认为它是唯一正在运行的事务,不受其他并发事务的干扰。它通过使用锁机制和并发控制算法来处理潜在的并发访问冲突。

  4. 持久性(Durability):一旦事务成功提交,其所做的更改将永久保存在数据库中,即使系统遇到故障或崩溃。持久性通过将事务日志记录在持久存储器(如磁盘)上来实现,以便在系统故障恢复后可以进行恢复和重放操作。

ACID事务属性保证了数据库操作的正确性、稳定性和一致性,使得数据库在多用户并发访问和故障恢复时能够保持可靠性。事务的概念是数据库管理系统中非常重要的一个概念,并在许多关系型数据库中得到广泛支持和实现。

事务场景描述--方便认知:

  1. 原子性(Atomicity) - 假设有一个转账操作,要从一个账户A向另一个账户B转移100元。在一个原子性的事务中,要么转账成功并且金额从A账户减少并添加到B账户,要么如果任何一步出错,都会回滚到转账之前的状态,确保不会出现只有一步操作成功的情况。

  2. 一致性(Consistency) - 假设有一个电子商务网站,当顾客下订单时,需要扣除库存。在一个一致性的事务中,库存会根据订单数量进行减少,并且只有在库存充足的情况下才会扣除,以保持数据的一致性。如果库存不足,事务将回滚,订单不会被处理,确保库存和订单之间的一致性。

  3. 隔离性(Isolation) - 假设同时有两个用户在进行查询和更新操作。在一个具有隔离性的事务中,每个用户的操作都是相互独立的,互不干扰。例如,如果用户A正在更新一个记录,用户B进行查询操作时,用户B将只能看到事务开始之前的记录,而不会看到用户A正在更新的中间状态。这保证了并发事务的数据隔离性,避免了脏读(Dirty Read)等问题。

  4. 持久性(Durability) - 假设数据库管理系统突然发生故障或系统崩溃,在一个具有持久性的事务中,已提交的事务的修改将被永久保存在数据库中。当系统恢复正常后,即使在故障期间的数据丢失,数据库也会回滚这些事务并且还原到最近一次提交的状态,以确保数据的持久性和一致性。这可以防止业务数据的丢失或损坏

行级锁定

        InnoDB支持行级锁定,这意味着只锁定需要修改的行,而不是锁定整个表或页面。行级锁定减少了锁冲突,允许更多并发操作。

        在InnoDB中,行级锁定是通过多版本并发控制(MVCC)来实现的。MVCC使用了版本号和回滚段来管理并发访问和修改数据的冲突。每个被修改的行都会有一个版本号,并且在修改期间生成一个新的版本,在读取时,事务只能看到早于其启动的版本的行。这样,当多个事务同时修改同一行时,它们不会发生冲突,因为每个事务都会操作不同的版本。

在底层实现上,InnoDB使用了以下几个关键组件来支持行级锁定:

  1. 锁:InnoDB使用排他锁(X锁)和共享锁(S锁)来实现行级锁定。事务在修改数据时会获得X锁,其他事务想要修改同一行时需要等待,但其他事务可以同时读取该行。事务在读取数据时会获得S锁,多个事务可以同时获得S锁,但如果有事务持有X锁,则其他事务需要等待。

  2. 锁等待和死锁检测:如果一个事务请求的锁被其他事务占用,它就会进入等待状态,直到锁可用。InnoDB使用死锁检测算法来检测和解决死锁情况,如果发现死锁,其中一个事务将会被回滚以解开死锁。

  3. 事务隔离级别:InnoDB支持多个事务隔离级别,如读未提交、读提交、可重复读和串行化。不同的隔离级别对锁定和并发访问的影响不同,可以根据应用程序的需求选择适当的隔离级别。

        总之,在InnoDB中,行级锁定通过MVCC实现,使用排他锁和共享锁来控制并发访问和修改数据库中的行。这种方式能够提高并发性能,并确保数据的一致性和可靠性。                

缓冲池(InnoDB Buffer Pool):

        InnoDB在内存中维护了一个专门的缓冲池,用于高速缓存数据和索引。这提高了数据的访问速度和整体性能。

        InnoDB的缓冲池是一块内存区域,用于存储数据库中的数据和索引页面。它是InnoDB存储引擎的关键组成部分,用于提高数据库系统的性能和响应速度。

        缓冲池的作用是将磁盘上频繁访问的数据和索引页面缓存在内存中,以减少磁盘的读写操作。通过将数据保留在内存中,可以加快对数据的访问速度,提高系统的响应能力。

        当应用程序需要读取或修改一部分数据时,首先会检查缓冲池中是否存在该数据页。如果数据页已经在缓冲池中,应用程序可以直接从内存中读取或修改数据,而无需进行磁盘IO操作。这可以大大加快数据的访问速度。

        如果数据页不在缓冲池中,系统将从磁盘读取相应的数据页到缓冲池,并在之后的访问中保留在内存中,以便提供更快的访问。当数据页被修改后,对应的内存中的数据也会被更新,而这些修改会在适当的时候被刷新回磁盘。

        通过使用缓冲池,InnoDB可以减少对磁盘的IO操作,提高数据库的性能和吞吐量。合理配置缓冲池的大小可以有效地利用可用内存资源,并最大程度地减少磁盘IO的需求。

        请注意,缓冲池的大小可以通过相关的配置参数进行设置,如innodb_buffer_pool_size。根据系统的需求和可用的内存资源,可以适当地调整缓冲池的大小以获得最佳的性能。

缓冲池中的底层以及工作方式:

在InnoDB中,缓冲池是一种用于存储数据库表数据和索引的内存缓存区域。它的主要目的是提高数据库的性能和响应速度。缓冲池使用了一种叫做“buffer pool”的机制来管理和调度内存空间。

下面是缓冲池的底层实现原理和工作方式:

  1. 缓冲池管理:缓冲池由一个固定大小的页面数组组成,每个页面的大小通常是16KB。缓冲池会根据需要自动地从磁盘上读取数据页面到内存中,并根据LRU(最近最少使用)算法进行页面替换。当需要查询或修改某个数据表时,InnoDB首先会在缓冲池中搜索所需的数据页面,如果找到则直接返回,否则会从磁盘读取。读取的数据页面会被放入缓冲池中,并且在内存中被缓存一段时间供后续的查询使用。

  2. 脏页管理:当数据发生修改时,InnoDB会将修改后的数据写入到缓冲池中,并将对应的页面标记为“脏页”。当脏页需要写入到磁盘时,InnoDB使用一种叫做“写前日志(Write Ahead Log, WAL)”的技术来确保数据的一致性和持久性。在写前日志的过程中,先将修改的数据写入到日志文件中,然后再将脏页写入磁盘。这样即使发生故障或者崩溃,通过恢复机制,可以从日志文件中回放操作,恢复到最新的一致状态。

  3. LRU算法:缓冲池中的页面采用LRU(最近最少使用)算法进行管理。当需要新的页面空间时,InnoDB会尝试从缓冲池中选择最近最少使用的页面进行替换,以便为新的页面腾出空间。这样,在频繁访问的数据页面上保持较高的缓存命中率,提高查询性能。

总之,InnoDB的缓冲池通过管理内存中的页面数组来缓存数据表和索引的页面,使用LRU算法进行页面替换。它优化了数据库的IO操作,提高了查询响应速度和并发性能。脏页管理和写前日志技术确保数据的一致性和持久性,避免了意外故障的损失或损坏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/980466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

活动报名场地预约自定义表单小程序开发

活动报名场地预约自定义表单小程序开发 专门为活动报名开发的一款小程序,可以自定义各种活动报名、活动预约,支持付费预约报名。 功能: 自定义字段:字符串、单选、复选、日期、列表、图片、城市、关联字段等自定义字段类型配置…

浅谈 Node.js 与快速入门使用——前端开发工程师必须要知道的技术(文末送书福利6.0)

文章目录 📋前言🎯什么是 Node.js🎯安装与使用 Node.js🧩直接安装 Node.js🧩使用 Node Version Manager(NVM)🧩使用 Node.js 🎯Node.js 基础知识🧩模块系统&a…

matplotlib 使用

import matplotlib.pyplot as plt %matplotlib inlineplt.figure()#创建一个画布 plt.plot([1, 0, 9], [4, 5, 6])#点数据,横坐标,纵坐标,相当于(1,4)(0,5)(9…

蒙特卡洛仿真

首先打开ADE,设置好要仿真的analysis以及output,工艺角选择mc 在ADE里面选择Launch-ADE XL,勾选想要仿真的输出(我这里要仿真的是DC电压)。 下图的输出结果要起好名字、type里面signal出来的结果是曲线图柱状图。expr(表达式&…

天纵竞赛系统助力22届汉语桥世界大学生中文比赛

由教育部中外语言交流合作中心主办的第22届“汉语桥”世界大学生中文比赛在广西举行。本届比赛共有来自120个国家的138名选手参加。“汉语桥”世界大学生中文比赛创办20多年来,吸引了全球160多个国家和地区的150多万青年学子参与,已成为具有世界影响力和…

如何实现OPC UA远程通讯?

目录 一. 准备工作 1.1 在对接前我们需准备如下物品 1.2 EG20网关准备工作 1.3 软件和下位机准备工作 二. EMCP平台设置 2.1 新增EG设备 2.2 网关绑定 2.3 通讯参数设置 2.4 创建设备驱动 2.5 报警信息设置 2.6 历史报表管理 2.7 画面组态 三. 实验效…

(2022|CVPR,LDM)使用潜在扩散模型进行高分辨率图像合成

High-Resolution Image Synthesis with Latent Diffusion Models 公众号:EDPJ(添加 VX:CV_EDPJ 进交流群获取资料) 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1 感知图像压缩 3.2 潜在扩散模型 3.3 调节机制 4. …

EF框架基础应用入门

文章目录 一、介绍二、EF6框架基础1. 数据模型和实体类2. 数据库上下文(DbContext)介绍3. 配置数据模型与数据库表的映射关系 两种方式Fluent API和数据注解Fluent API数据注解 4. 数据库迁移(Migration)概述a. 创建初始迁移b. 更…

需求评审时如何平衡团队成员间意见?

需求评审对于产品经理而言非常重要,通过需求评审我们可以提前规避可能的需求风险,减少因返工造成的资源浪费。如果不进行需求评审,这将直接影响项目的风险指数。 那么我们应该如何做好需求评审,有哪些需要注意的维度?如…

umi/max如何给请求增加公共header

直接上代码 根据 umi官网 介绍可知,umi/max仅提供一种运行时配置的方法。 如果是搭配typescript开发的话,最好使用umi/max提供的RequestConfig类型进行字段控制。 因为是在app.ts中添加的配置,但是并不知道该配置是在何时何地如何被使用的&…

swagger---接口文档管理生成管理工具

Swagger–接口生成工具 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,再通过Swagger衍生出来的一系列项目和工具, 就可以做到生成各种格式的接口文档,以及在线接口调试页面等等。 官网: https://lswagger.io/knife4j是为Jav…

业务逻辑漏洞复现

文章目录 一分钱买夹克任意商品购买 一分钱买夹克 登录portswigger,在all-labs中选择下面的题目: 打开后选择第一个商品: 打开后数量选择1,并用bp拦截数据包,点击添加购物车: 修改价格为1,点…

解密全产业供应关系,助力企业寻找客户资源,洞察商机

在当今商业竞争日益激烈的时代,企业要实现长期可持续的发展,需要深入了解供应链关系,抢先捕获商机,拓展优质的客户资源。然而,供应链关系错综复杂,商机、客户隐藏在其中,如何挖掘和洞察成为了企…

力扣(LeetCode)算法_C++——寻找重复的子树

给你一棵二叉树的根节点 root ,返回所有 重复的子树 。 对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。 如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复 的。 示例 1: 输入:root…

五大类注解和方法注解详解

五大类注解为Controller,Service,Repository,Configuration,Component,方法注解为Bean。 需要注意的是:Bean注解必须要在类注解修饰的类内才能正常使用。 一、与配置文件的关系 在spring原生项目中 如果你使用的spri…

亚马逊运营中,卖家们应该怎么挑选产品?

如今做亚马逊,选品是非常重要的。“七分靠选品,三分靠运营”,这话虽然会得罪运营小伙伴,但是目前平台就是这么个情况,一款好的产品基本上不需要花太多心思,加上一些运营技巧就能够很快表现优异。 那么选品…

深入浅出了解BeanFactory 和 ApplicationContext

一.区别 BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。 1.依赖关系 BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean…

【系统设计系列】延迟吞吐和一致性

系统设计系列初衷 System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版: https://github.com/donnemarti…

Windows下搜索文件内容的关键字用什么命令

Windows下搜索文件内容的关键字用什么命令 findstr /s /n /i "keyword" file_path其中,/s 表示递归检索子文件夹,/n 表示显示搜索结果所在行号,/i 表示忽略大小写,“keyword” 是要搜索的关键字,file_path 是…

android程序中,产生ANR原因与分析解决

产生原因 在android程序中,所有的输入(key和touch等)事件是由底层的InputDispatcher分发到上层的InputManagerService的,再通过InputManagerService内部的InputMonitor送入WindowManagerService的Policy(PhoneWindowM…