做影视网站风险大吗,建设商城网站公司,oa办公系统有哪些,少儿编程学什么文章目录 0.前言1.基础介绍2.1. InnoDB存储引擎底层原理InnoDB记录存储结构和索引页结构InnoDB记录存储结构#xff1a;InnoDB索引页结构#xff1a; 3. MVCC 详解3.1. 版本号分配#xff1a;3.2. 数据读取#xff1a;3.3. 数据写入#xff1a;3.4. 事务隔离级别#xff… 文章目录 0.前言1.基础介绍2.1. InnoDB存储引擎底层原理InnoDB记录存储结构和索引页结构InnoDB记录存储结构InnoDB索引页结构 3. MVCC 详解3.1. 版本号分配3.2. 数据读取3.3. 数据写入3.4. 事务隔离级别3.5. 数据清理 参考资料 0.前言
MySQL是世界上最受欢迎的开源关系数据库管理系统之一。MySQL的一个主要特性是其插件式存储引擎架构这意味着你可以根据特定的工作负载和需求选择不同的存储引擎。
它支持多种存储引擎。下面将详细解释MySQL的存储引擎包括InnoDB、MyISAM、Memory等。每种存储引擎都有其应用的场景和特点选择哪种引擎取决于数据的特性和应用的需求。在设计数据库时应该根据需要选择合适的存储引擎。 InnoDBInnoDB是MySQL的默认存储引擎。它提供了事务安全ACID兼容的表并具有提交、回滚和崩溃恢复功能。InnoDB还支持行级锁定外键约束等特性。由于它的事务安全特性和处理大量数据时的高性能它通常用于大型应用。 MyISAMMyISAM是MySQL的另一种存储引擎。它是基于早期ISAM代码的扩展提供了大量的功能比如全文索引、压缩、空间函数等。然而MyISAM不支持事务和行级锁定只支持表级锁定因此在数据安全性和并发性方面不如InnoDB。 MemoryMemory存储引擎创建的表只存在于内存中也就是说当MySQL服务器关闭后表中的数据会丢失。Memory引擎非常快因为它避免了磁盘I/O但它只支持HASH索引。这种存储引擎非常适合存储临时数据。 NDB或者叫做ClusterNDB 是一个分布式存储引擎主要用于创建高可用性的集群环境。NDB 支持数据的实时复制和冗余存储因此它可以提供很高的可用性和可靠性。 BlackholeBlackhole存储引擎并不存储任何数据但它会记录所有写操作的日志。这种引擎常用于复制数据到从服务器或者用于审计。 ArchiveArchive存储引擎用于存储和检索大量的归档数据。它使用gzip算法进行压缩从而节省存储空间。然而Archive只支持INSERT和SELECT操作不支持DELETE和UPDATE操作。
1.基础介绍
存储引擎功能描述使用场景优点缺点InnoDB支持事务处理、行级锁定、外键以及崩溃后的安全恢复。适用于需要事务处理的系统如电子商务、银行等。具有提交、回滚、崩溃恢复能力支持行级锁定提高并发性能。占用的磁盘空间相对较大内存需求也较大。MyISAM不支持事务处理、表级锁定、全文搜索以及压缩数据的能力。适用于只读或者插入新记录的系统如博客、新闻发布等。占用的磁盘空间和内存较小处理速度快。不支持事务处理数据易丢失。Memory所有的数据都存储在内存中数据的处理速度快但是数据在MySQL重启后会丢失。适用于临时数据存储和缓存。数据处理速度快。存储空间有限数据不持久化。Archive适用于存储和检索大量的归档数据如日志信息。适用于大量的归档数据如日志信息。数据压缩节省存储空间。不支持事务只支持插入和选取操作。Blackhole黑洞引擎数据写入后即消失可以用于复制数据库。适合在主从复制时只做记录用。不占用存储空间。数据不可恢复。Federated分布式存储引擎可以访问远程的MySQL表就像本地一样。适用于分布式数据存储。可以访问远程数据。网络延迟和稳定性会影响数据访问。CSVCSV存储引擎存储的数据是以文本的形式存放。适用于数据的导入导出。可以直接用文本编辑器查看和编辑数据。不支持索引。NDBMySQL集群存储引擎提供事务性存储引擎。适用于大型网络应用。支持大规模并发处理。配置和管理复杂。
2.1. InnoDB存储引擎底层原理 InnoDB是MySQL默认的存储引擎它的底层原理主要包括以下几个方面 事务支持InnoDB支持ACID事务模型能够提供提交(commit)、回滚(rollback)和恢复(recovery)等功能。InnoDB在每个事务中都使用了一个事务日志来记录事务中所有的更改。如果在事务完成之前数据库崩溃InnoDB能够使用事务日志来恢复数据库的状态。 MVCCInnoDB使用多版本并发控制(MVCC)来管理并发事务。MVCC允许多个读写事务并发执行而不需要进行加锁操作从而提高了数据库的并发性能。 行级锁定InnoDB支持行级别的锁定这是一个重要的区别于其他如MyISAM等存储引擎的特性。行级锁定可以大大提高数据库的并发性能因为在进行数据更改时只有被更改的数据行被锁定其他行仍然可以被其他事务访问。 索引InnoDB存储引擎使用B树作为其索引的数据结构特别是其主键索引是聚簇索引这意味着主键索引的叶子节点就是实际的数据行。这样的设计使得按主键的查询非常快但是非主键的查询则需要两次索引查找一次是在非主键索引上一次是在主键索引上。 数据存储InnoDB将数据存储在表空间中。表空间可以包含多个数据文件这些数据文件可以在磁盘上的不同位置。 内存缓存InnoDB具有一个内置的缓冲池用来缓存表数据和索引数据。这些数据在被访问时会被加载到缓冲池中这可以大大提高数据库的性能。
InnoDB记录存储结构和索引页结构 #mermaid-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记录存储结构 记录头信息每条记录前都有一些额外的信息包含了当前记录的信息例如记录的长度记录所在的行是否删除等。 记录数据保存的是表中的行记录即用户实际的数据。 尾部信息记录了一些校验信息如新字段的值的校验和。 下一记录的指针指向下一条记录。 上一记录的指针指向上一条记录。
InnoDB索引页结构 页面头部存储了一些管理页面的信息如页面类型记录的数量记录的地址等。 Infimum 和 Supremum 记录Infimum 记录是页中记录的下限Supremum 记录是页中记录的上限。 用户记录保存的是表中的行记录即用户实际的数据。 Free Space空闲空间用于存储新的记录。 页面目录页目录保存了页中所有记录主键值的位置信息用于加速表的查找。 页面尾部保存了页的校验码。 .
3. MVCC 详解
MVCCMulti-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策略的数据库 PostgreSQL它使用 MVCC 提供多个并发用户间的一致性视图。 MySQL在可重复读取隔离级别下MySQL的InnoDB存储引擎利用 MVCC 解决读写冲突提供快照数据而非最新数据。 Oracle尽管Oracle使用了MVCC但其实现方法与PostgreSQL和MySQL的InnoDB不同。在Oracle中读操作不会阻塞写操作反之亦然。 SQLiteSQLite使用了snapshot isolation它的核心概念与MVCC相似都是在事务开始时提供一个快照而非实时数据。 CouchDB 和 MongoDB这两个NoSQL数据库也采用了MVCC或类似技术。 Apache HBase作为开源的非关系型分布式数据库HBase是Google BigTable的Java实现也使用了MVCC。 Apache Cassandra这是Facebook开发的一款开源分布式NoSQL数据库系统用于满足高速读写需求如Inbox搜索它也实现了MVCC。 MariaDB作为MySQL的一个开源分支版本MariaDB的InnoDB存储引擎也使用了MVCC。 Microsoft SQL Server在读已提交快照和快照隔离级别下SQL Server使用了MVCC。 Hyperledger Fabric这是一个开源的区块链平台它使用了MVCC来解决交易冲突。 Tarantool作为一个开源的NoSQL数据库和Lua应用服务器Tarantool使用了MVCC。 Greenplum基于PostgreSQL开发的大规模并行处理数据库管理系统Greenplum也实现了MVCC。 Firebird作为一个提供众多SQL标准特性的关系数据库Firebird也实现了MVCC。 SAP HANA这是一个基于内存的关系数据库管理系统同样实现了MVCC。 参考资料 官方文档MySQL官方网站提供了关于各种存储引擎的详细文档包括InnoDB和MyISAM等。https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html 书籍《高性能MySQL》是一本非常全面的关于MySQL性能优化、架构设计和内部机制的书籍其中包含了大量关于存储引擎的内容。