返回顶部
首页 > 资讯 > 数据库 >【进阶篇】MySQL 存储引擎详解
  • 362
分享到

【进阶篇】MySQL 存储引擎详解

mysql数据库 2023-09-07 18:09:34 362人浏览 泡泡鱼
摘要

文章目录 0.前言1.基础介绍2.1. InnoDB存储引擎底层原理InnoDB记录存储结构和索引页结构InnoDB记录存储结构:InnoDB索引页结构: 3. MVCC 详解3.1. 版

文章目录


在这里插入图片描述

0.前言

Mysql是世界上最受欢迎的开源关系数据库管理系统之一。mysql的一个主要特性是其插件式存储引擎架构,这意味着你可以根据特定的工作负载和需求选择不同的存储引擎。

它支持多种存储引擎。下面将详细解释Mysql的存储引擎,包括InnoDBMyISAMMemory等。每种存储引擎都有其应用的场景和特点,选择哪种引擎取决于数据的特性和应用的需求。在设计数据库时,应该根据需要选择合适的存储引擎。

  1. InnoDB:InnoDB是MySQL的默认存储引擎。它提供了事务安全(ACID兼容)的表,并具有提交、回滚和崩溃恢复功能。InnoDB还支持行级定,外键约束等特性。由于它的事务安全特性和处理大量数据时的高性能,它通常用于大型应用。

  2. MyISAM:MyISAM是MySQL的另一种存储引擎。它是基于早期ISAM代码的扩展,提供了大量的功能,比如全文索引、压缩、空间函数等。然而,MyISAM不支持事务和行级锁定,只支持表级锁定,因此在数据安全性和并发性方面不如InnoDB。

  3. Memory:Memory存储引擎创建的表只存在于内存中,也就是说,当MySQL服务器关闭后,表中的数据会丢失。Memory引擎非常快,因为它避免了磁盘I/O,但它只支持HASH索引。这种存储引擎非常适合存储临时数据。

  4. NDB(或者叫做Cluster):NDB 是一个分布式存储引擎,主要用于创建高可用性的集群环境。NDB 支持数据的实时复制和冗余存储,因此它可以提供很高的可用性和可靠性。

  5. Blackhole:Blackhole存储引擎并不存储任何数据,但它会记录所有写操作的日志。这种引擎常用于复制数据到从服务器或者用于审计。

  6. ArcHive:Archive存储引擎用于存储和检索大量的归档数据。它使用gzip算法进行压缩,从而节省存储空间。然而,Archive只支持INSERT和SELECT操作,不支持DELETE和UPDATE操作。

1.基础介绍

存储引擎功能描述使用场景优点缺点
InnoDB支持事务处理、行级锁定、外键,以及崩溃后的安全恢复。适用于需要事务处理的系统,如电子商务、银行等。具有提交、回滚、崩溃恢复能力,支持行级锁定,提高并发性能。占用的磁盘空间相对较大,内存需求也较大。
MyISAM不支持事务处理、表级锁定、全文搜索,以及压缩数据的能力。适用于只读或者插入新记录的系统,如博客、新闻发布等。占用的磁盘空间和内存较小,处理速度快。不支持事务处理,数据易丢失。
Memory所有的数据都存储在内存中,数据的处理速度快,但是数据在MySQL重启后会丢失。适用于临时数据存储和缓存数据处理速度快。存储空间有限,数据不持久化。
Archive适用于存储和检索大量的归档数据,如日志信息。适用于大量的归档数据,如日志信息。数据压缩,节省存储空间。不支持事务,只支持插入和选取操作。
Blackhole黑洞引擎,数据写入后即消失,可以用于复制数据库。适合在主从复制时,只做记录用。不占用存储空间。数据不可恢复。
Federated分布式存储引擎,可以访问远程的MySQL表就像本地一样。适用于分布式数据存储。可以访问远程数据。网络延迟和稳定性会影响数据访问。
CSVCSV存储引擎,存储的数据是以文本的形式存放。适用于数据的导入导出。可以直接用文本编辑器查看和编辑数据。不支持索引。
NDBMySQL集群存储引擎,提供事务性存储引擎。适用于大型网络应用。支持大规模并发处理。配置和管理复杂。

2.1. InnoDB存储引擎底层原理

在这里插入图片描述

InnoDB是MySQL默认的存储引擎,它的底层原理主要包括以下几个方面:

  1. 事务支持:InnoDB支持ACID事务模型,能够提供提交(commit)、回滚(rollback)和恢复(recovery)等功能。InnoDB在每个事务中都使用了一个事务日志来记录事务中所有的更改。如果在事务完成之前数据库崩溃,InnoDB能够使用事务日志来恢复数据库的状态。

  2. mvcC:InnoDB使用多版本并发控制(MVCC)来管理并发事务。MVCC允许多个读写事务并发执行,而不需要进行加锁操作,从而提高了数据库的并发性能。

  3. 行级锁定:InnoDB支持行级别的锁定,这是一个重要的区别于其他如MyISAM等存储引擎的特性。行级锁定可以大大提高数据库的并发性能,因为在进行数据更改时,只有被更改的数据行被锁定,其他行仍然可以被其他事务访问。

  4. 索引:InnoDB存储引擎使用B+树作为其索引的数据结构,特别是,其主键索引是聚簇索引,这意味着主键索引的叶子节点就是实际的数据行。这样的设计使得按主键的查询非常快,但是非主键的查询则需要两次索引查找,一次是在非主键索引上,一次是在主键索引上。

  5. 数据存储:InnoDB将数据存储在表空间中。表空间可以包含多个数据文件,这些数据文件可以在磁盘上的不同位置。

  6. 内存缓存:InnoDB具有一个内置的缓冲池,用来缓存表数据和索引数据。这些数据在被访问时会被加载到缓冲池中,这可以大大提高数据库的性能。

InnoDB记录存储结构和索引页结构

aid-svg-FRehtH6CSSadH71O {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FRehtH6csSadH71O .error-icon{fill:#552222;}#mermaid-svg-FRehtH6csSadH71O .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FRehtH6csSadH71O .edge-thickness-nORMal{stroke-width:2px;}#mermaid-svg-FRehtH6csSadH71O .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FRehtH6csSadH71O .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FRehtH6csSadH71O .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FRehtH6csSadH71O .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FRehtH6csSadH71O .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FRehtH6csSadH71O .marker.cross{stroke:#333333;}#mermaid-svg-FRehtH6csSadH71O svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FRehtH6csSadH71O .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FRehtH6csSadH71O .cluster-label text{fill:#333;}#mermaid-svg-FRehtH6csSadH71O .cluster-label span{color:#333;}#mermaid-svg-FRehtH6csSadH71O .label text,#mermaid-svg-FRehtH6csSadH71O span{fill:#333;color:#333;}#mermaid-svg-FRehtH6csSadH71O .node rect,#mermaid-svg-FRehtH6csSadH71O .node circle,#mermaid-svg-FRehtH6csSadH71O .node ellipse,#mermaid-svg-FRehtH6csSadH71O .node polyGon,#mermaid-svg-FRehtH6csSadH71O .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FRehtH6csSadH71O .node .label{text-align:center;}#mermaid-svg-FRehtH6csSadH71O .node.clickable{cursor:pointer;}#mermaid-svg-FRehtH6csSadH71O .arrowheadPath{fill:#333333;}#mermaid-svg-FRehtH6csSadH71O .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FRehtH6csSadH71O .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FRehtH6csSadH71O .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-FRehtH6csSadH71O .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-FRehtH6csSadH71O .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FRehtH6csSadH71O .cluster text{fill:#333;}#mermaid-svg-FRehtH6csSadH71O .cluster span{color:#333;}#mermaid-svg-FRehtH6csSadH71O div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FRehtH6csSadH71O :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 页面头部 页面目录 Infimum & Supremum 记录 用户记录 空闲空间 页面页脚 记录头部 空值标记 固定长度列 可变长度列 InnoDB 记录 页面头部 页面目录 Infimum & Supremum 记录 用户记录 空闲空间 页面页脚 记录头部 空值标记 固定长度列 可变长度列

InnoDB记录存储结构:

  1. 记录头信息:每条记录前都有一些额外的信息,包含了当前记录的信息,例如记录的长度,记录所在的行是否删除等。

  2. 记录数据:保存的是表中的行记录,即用户实际的数据。

  3. 尾部信息:记录了一些校验信息,如新字段的值的校验和。

  4. 下一记录的指针:指向下一条记录。

  5. 上一记录的指针:指向上一条记录。

InnoDB索引页结构:

  1. 页面头部:存储了一些管理页面的信息,如页面类型,记录的数量,记录的地址等。

  2. Infimum 和 Supremum 记录:Infimum 记录是页中记录的下限,Supremum 记录是页中记录的上限。

  3. 用户记录:保存的是表中的行记录,即用户实际的数据。

  4. Free Space:空闲空间,用于存储新的记录。

  5. 页面目录:页目录保存了页中所有记录主键值的位置信息,用于加速表的查找。

  6. 页面尾部:保存了页的校验码。
    .

3. MVCC 详解

MVCC(Multi-Version Concurrency Control)是MySQL中用于实现并发控制的机制。它通过为每个事务提供一个独立的数据版本来保证事务的隔离性和一致性。下面是MySQL MVCC的详细解释:

3.1. 版本号分配:

  • 在每个数据行中,MySQL会为每个修改操作(插入、更新、删除)分配一个唯一的版本号或时间戳。
  • 版本号可以是递增的事务ID或其他类型的时间戳。

3.2. 数据读取:

  • 当事务开始时,会记录当前事务的开始时间戳或ID。
  • 在读取数据时,MySQL只会向事务展示在其开始时间戳之前的数据版本。
  • 这意味着事务不会读取到其他并发事务修改的数据。

3.3. 数据写入:

  • 当事务对数据进行修改时,MySQL会生成一个新的数据版本并将其写入数据库。
  • 新版本会被分配一个新的版本号或时间戳。
  • 原始数据版本仍然存在,对于其他事务仍然可见。

3.4. 事务隔离级别:

  • MVCC支持MySQL的多个事务隔离级别,如读未提交、读已提交、可重复读和串行化。
  • 在不同的隔离级别下,MySQL的MVCC机制会根据需求来决定哪些数据版本对事务可见,以保证事务的隔离性和一致性。

3.5. 数据清理:

  • 当事务完成后,MySQL会根据需要进行数据清理。
  • 已提交的事务产生的旧数据版本将被清理,释放存储空间。
  • 未提交的事务产生的数据版本仍然存在,直到事务提交或回滚。

MVCC机制使得不同的事务可以并发地读取和修改数据,而不会相互干扰或产生不一致的结果。它提供了更高的并发性和隔离性,减少了锁的竞争,提高了数据库的性能。然而,需要注意的是,MVCC机制会占用一定的存储空间来维护多个数据版本,因此在设计数据库时需要考虑存储需求。

Created with Raphaël 2.3.0 开始事务 更新系统版本号 读取数据 满足条件? 写入数据 事务提交,更新过期版本号 结束事务 产生冲突,回滚 yes no

MVCC 不是MySQL的特有机制,除了MySQL 使用了MVCC机制,其他数据库版本也使用了 以下是一些采用了多版本并发控制(MVCC)策略的数据库:

  1. postgresql:它使用 MVCC 提供多个并发用户间的一致性视图。

  2. MySQL:在可重复读取隔离级别下,MySQL的InnoDB存储引擎利用 MVCC 解决读写冲突,提供快照数据而非最新数据。

  3. oracle:尽管Oracle使用了MVCC,但其实现方法与PostgreSQL和MySQL的InnoDB不同。在Oracle中,读操作不会阻塞写操作,反之亦然。

  4. SQLite:SQLite使用了"snapshot isolation",它的核心概念与MVCC相似,都是在事务开始时提供一个快照,而非实时数据。

  5. CouchDB 和 mongoDB:这两个NoSQL数据库也采用了MVCC或类似技术。

  6. Apache HBase:作为开源的非关系型分布式数据库,HBase是Google BigTable的Java实现,也使用了MVCC。

  7. Apache Cassandra:这是Facebook开发的一款开源分布式NoSQL数据库系统,用于满足高速读写需求,如Inbox搜索,它也实现了MVCC。

  8. MariaDB:作为MySQL的一个开源分支版本,MariaDB的InnoDB存储引擎也使用了MVCC。

  9. Microsoft SQL Server:在读已提交快照和快照隔离级别下,SQL Server使用了MVCC。

  10. Hyperledger Fabric:这是一个开源的区块链平台,它使用了MVCC来解决交易冲突。

  11. Tarantool:作为一个开源的NoSQL数据库和lua应用服务器,Tarantool使用了MVCC。

  12. Greenplum:基于PostgreSQL开发的大规模并行处理数据库管理系统Greenplum也实现了MVCC。

  13. Firebird:作为一个提供众多SQL标准特性的关系数据库,Firebird也实现了MVCC。

  14. SAP HANA:这是一个基于内存的关系数据库管理系统,同样实现了MVCC。

参考资料

  1. 官方文档:MySQL官方网站提供了关于各种存储引擎的详细文档,包括InnoDB和MyISAM等。https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html

  2. 书籍:《高性能MySQL》是一本非常全面的关于MySQL性能优化架构设计和内部机制的书籍,其中包含了大量关于存储引擎的内容。

来源地址:https://blog.csdn.net/wangshuai6707/article/details/132555117

您可能感兴趣的文档:

--结束END--

本文标题: 【进阶篇】MySQL 存储引擎详解

本文链接: https://lsjlt.com/news/398809.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【进阶篇】MySQL 存储引擎详解
    文章目录 0.前言1.基础介绍2.1. InnoDB存储引擎底层原理InnoDB记录存储结构和索引页结构InnoDB记录存储结构:InnoDB索引页结构: 3. MVCC 详解3.1. 版...
    99+
    2023-09-07
    mysql 数据库
  • 【MySQL进阶教程】 存储引擎详细介绍
    前言 本文为 【MySQL进阶教程】 存储引擎 相关知识介绍,下边具体将对MySQL体系结构,存储引擎介绍,存储引擎特点(包含:InnoDB、MyISAM、Memory的特点及对比),存储引擎选择等...
    99+
    2023-08-31
    mysql java 数据库
  • [MySQL--进阶篇]存储引擎的体系结构、简介、特点、选择
    前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录:不要在乎别人怎么看你,因为他们根本就没有时间,他们只关心他们自己。 ⭐个人主页:欧_aita ψ(._. )>⭐个人专栏: 数据结构与算法 MySQL数据库 存储...
    99+
    2023-12-22
    mysql adb android
  • 详解mysql中的存储引擎
    mysql存储引擎概述 什么是存储引擎? MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技...
    99+
    2022-05-24
    MySQL 存储 MySQL 存储引擎
  • 【MySQL】基础实战篇(3)—九大储存引擎详解
    引擎 InnoDB引擎MyISAM引擎对比Archive引擎Blackhole引擎CSV引擎Memoy引擎4.7Federated引擎Merge引擎NDB引擎 InnoDB引擎 具备外键支...
    99+
    2023-10-10
    mysql 数据库
  • MySQL进阶篇之存储过程(procedure)
    04、视图/存储过程/触发器 4.1、视图(view) 4.2、存储过程(procedure) 4.2.1、介绍 介绍 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据...
    99+
    2023-08-19
    mysql 数据库 sql
  • MYSQL存储引擎
    存储引擎 InnoDB      (1) InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加...
    99+
    2021-04-17
    MYSQL存储引擎
  • Mysql--存储引擎
      1.文件系统: 1.1 操作系统组织和存取数据的一种机制。 1.2 文件系统是一种软件。 2.文件系统类型:ext2 3 4 ,xfs 数据 2.1 不管使用什么文件系统,数据内容不会变化 2.2 不...
    99+
    2021-09-03
    Mysql--存储引擎
  • MySQL 存储引擎
      存储引擎 DBMS使用存储引擎进行数据的创建、查询、更新、删除操作。 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。 MySQL提供了多种存储引擎,最常见的有3种。    ...
    99+
    2015-11-16
    MySQL 存储引擎
  • MySQL 存储引擎
    简介:存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。    常见分类有:InnoDB、MyISAM、Memory等; 一、InnoDB  ...
    99+
    2017-04-10
    MySQL 存储引擎 数据库入门 数据库基础教程 数据库 mysql
  • mysql-存储引擎
    存储引擎 完整的建表语句: CREATE TABLE dept ( DEPTNO int(2) NOT NULL, DNAME varchar(14) DEFAULT NULL, LOC varchar(13) DEF...
    99+
    2020-03-17
    mysql-存储引擎
  • MYSQL——存储引擎
       MYSQL的存储引擎1   MYSQL可以将数据以不同的技术存储在文件和内存中,这种技术就成为存储引擎2   每一种存储引擎使用不同的存储机制、索引技巧、锁定水...
    99+
    2024-04-02
  • Mysql -存储引擎
    1、存储引擎:是表级别的类型。 2、查看表存储引擎的方法: (1)、mysql> show table status in mydb where name='classes'\G; 1. ...
    99+
    2024-04-02
  • 【MySQL】存储引擎
    文章目录 1. 前言2. MySQL的体系结构3. 存储引擎简介4. InnoDB介绍5. MyISAM介绍6. Memory7. 存储引擎的选择8. 总结 1. 前言 存储引擎是 MySQL 的核心组件之一,负责数据的存储和管...
    99+
    2023-08-16
    mysql 数据库 sql
  • 详解MySQL InnoDB存储引擎的内存管理
    存储引擎之内存管理 在InnoDB存储引擎中,数据库中的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法来进行管理的,即最频繁使用的页在LRU列表的最前段,而最少使用的页在LRU列表的尾端...
    99+
    2022-05-13
    MySQL InnoDB InnoDB 内存管理 InnoDB 存储引擎
  • MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解
    本文源码:GitHub·点这里 || GitEE·点这里 一、MySQL逻辑架构 1、逻辑架构图 基于下面的逻辑架构图,可以大致熟悉MySQL各个架构组件之间的协同工作关系。 很经典的C/S架构风格,即客户端/服务端模式。 ...
    99+
    2018-06-02
    MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解
  • MySQL 存储引擎(2)
    首先我们带着下边三个问题来认识存储引擎 存储引擎在MySQL中的作用是什么? MySQL都有哪些存储引擎 SQL又与存储引擎有什么关系? 存储引擎在MySQL中的作用是什么? 顾名思义,存储引擎就是用于存储我们的数据的。在关系型数据库中...
    99+
    2016-06-21
    MySQL 存储引擎(2)
  • mysql federated存储引擎
    通过federated存储引擎建立远程连接表 # 开启federated存储引擎 SHOW ENGINES ; MyISAM YES InnoDB DEFAULT ... FEDERATED YES # 创建...
    99+
    2020-02-03
    mysql federated存储引擎
  • MySQL之存储引擎
    Storage Engine是指表类型,也即在表创建时指明其使用的存储引擎,同一库中不同表可以使用不同的存储引擎,但建议要使用同一种存储引擎 MySQL体系结构 存储引擎 In...
    99+
    2024-04-02
  • MySQL的存储引擎
    1、存储引擎概念 • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎 • 存储引擎是MySQL将数据存储在...
    99+
    2023-09-07
    mysql 数据库 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作