桓楠百科网

编程知识、经典语录与百科知识分享平台

MySQL的存储引擎有哪些?它们之间有什么区别?

存储引擎是MySQL中用来管理和操作数据存储、索引和检索数据的核心组件,它决定了在MySQL中数据的存储结构、数据的存储方式、数据的锁定机制、事务机制、事务恢复机制等等内容。简单来讲,存储引擎就是MySQL在物理层面上的数据存储和管理的方式,也就是说存储引擎才是真正管理和存储数据的核心组件,MySQL自身并不直接管理数据数据的存储,而是通过不同的数据存储引擎来执行数据管理的操作。

在MySQL中,我们可以为每一个不同的数据表来指定不同的存储引擎,并且也可以根据实际需求来指定我们想要用到的存储引擎。

存储引擎的作用

根据上面的描述,我们可以知道,存储引擎的核心作用就是决定如何存储数据和管理数据,如下所示。

数据存储

数据存储引擎定义了数据在磁盘上的存储方式,例如在InnoDB和MyISAM引擎中,会将数据存储在磁盘中的不同形式的文件中,对于InnoDB存储引擎来讲,数据会被存储在一个或者是多个表空间文件中,而对于MyISAM存储引擎来讲,每个数据表通常会由数据文件 .MYD,索引文件 .MYI,表结构文件 .frm三个文件组成数据存储文件。

数据查询

存储引擎为SQL查询提供了底层的数据操作支持,例如数据索引结构的管理选择,数据的存取流程的管理。通过各种不同的查询优化机制,来提高数据查询的效率。

事务操作支持

在一些常见的存储引擎会支持ACID的事务操作,也就是我们常说的原子性、一致性、隔离性和持久性。确保数据能够可靠的存储到数据服务器上,通过事务操作可以支持用户在对多个SQL语句进行操作,而不会导致数据不一致的情况发生。

并发控制

在存储引擎中通过提供不同的锁机制来进行并发操作的控制,避免数据操作带来的各种并发问题,例如在InnoDB存储引擎中通过行级锁以及多版本并发控制来实现数据的高效并发读写操作,而在MyISAM存储引擎中则是提供了表级锁来对数据的并发读写操作进行控制。

数据完整性

通过各种的机制来支持在数据库崩溃的情况下能够通过事务操作日志对相关的数据进行恢复避免造成数据丢失的问题,而通过事务日志和重做人质还可以恢复一些没有完成的操作,能够有效的保证在出现故障的时候的数据完整性。

当然除了上面的这些作用之外,存储引擎还提供了数据压缩存储,可以节省大量的磁盘空间提高数据的存储效率,同事通过对分布式技术的支持,可以保证数据的高可用性以及分布式数据存储的冗余性,能够将数据分布到多个节点中,在提高系统扩展能力的同时也可以增强数据库系统的容错能力。

存储引擎介绍

在MySQL中,数据库存储引擎决定了在物理层面上的数据的存储以及管理方式,不同的存储引擎提供了不同的存储和管理机制,下面是比较常用的几种存储引擎的汇总,如下所示。

InnoDB存储引擎

这个存储引擎支持了完整的ACID事务,使用于对于数据一致性要求较高的场景中。在InnoDB存储引擎中,支持了基于行级锁的数据并发读写策略,能够在数据并发读写场景中提供更好的灵活性。通过MVCC机制来实现在高并发场景中的事务隔离性的控制。

在表数据一致性的操作中,可以表与表之间的外键约束操作,在不同的表结构之间形成数据完整性约束,保证数据之间的强依赖关系,还提供了事务日志和自动恢复机制可以对未提交的事务进行自动恢复。

一般情况下,InnoDB的数据会被存储在一个共享的数据表空间中,也就是常见的.ibd的文件,这个文件就是用来专门存储InnoDB的一张表的文件,有兴趣的读者可以看看在采用了InnoDB引擎之后,在MySQL的data目录下就全是.ibd的文件。

MyISAM存储引擎

这是一种非事务型的存储引擎,也就是说并不支持ACID事务操作,所以对于一些事务性操作不是太强的场景,MyISAM应该是一个很不错的选择。在MyISAM存储引擎中支持的事基于表级锁的操作,也就是说对于数据的查询操作来讲,会锁定整个的数据表,这种操作相对于行级锁的操作来讲性能就比较低了,尤其是在一些读写操作比较频繁的操作中。

在MyISAM存储引擎中还支持了数据表压缩操作,也就是说,可以通过myisampack工具可以对表数据进行压缩,从而达到提高存储量量的目的,这种方式适合存储一些不经常使用的历史数据。

根据上面的描述既然MyISAM存储引擎没有那么多的并发限制,所以对于读操作来讲性能会比较高一点,所以适合用在一些读多写少的场景中,然后经过索引结构的优化可以有效的提高数据检索的效率。

对于数据约束来讲,并不支持像是InnoDB一样的外键约束,也就是说使用了MyISAM存储引擎的数据需要通过逻辑结构来进行数据的约束,并且MyISAM还不支持数据库的崩溃自动恢复机制 ,因此无法像是InnoDB一样自动进行数据的恢复,想要恢复数据需要借助于其他的手段,例如数据备份来实现。

Memory存储引擎

通过这个存储引擎,会将MySQL中的所有数据都存储到内存中,所以对于查询操作来讲这种方式应该是比较高效的,但是由于是存储在内存中的,所以每次重启MySQL之后,数据就会丢失,有点类似于Redis。在Memory存储引擎中也是通过表级锁来进行并发控制。因此在高并发场景下可能会存在读写操作性能问题。

另外对于Memory来讲由于重启就会造成数据丢失,所以说明这个存储引擎并不支持数据持久化的操作,所以适合用来做一些数据临时存储以及数据缓存操作。并且它底层默认情况下通过Hash索引来进行数据的查询支持,所以查询性能方面也是比较高的。

NDB(Cluster)存储引擎

这是一个分布式的存储引擎,支持分布式架构,在多个节点的存储中可以有效的保证数据库的高可用和扩展性。通过多个节点的存储,提供了内部的数据冗余操作,通过这些冗余数据来实现自动的故障转移以及数据容错操作,如果某个节点出现了故障,那么其他节点也可以正常的提供服务。

与Memory类似,NDB的数据也是存储在内存中,所以可以保证非常高的读写速度,但是也就意味着需要大量的内存来进行数据的存储,但是它的优势就在于它可以支持ACID事务操作,尤其是在高负载的环境中。

通过数据自动分片技术,可以实现多节点之间的数据动态分配,这样可以支持MySQL Cluster 能够横向扩展以处理大量数据。适用于大规模的分布式应用,特别是对高可用性、高并发、高吞吐量有需求的场景,如电信、社交平台、实时在线服务等。

总结

存储引擎 是 MySQL 中处理数据存储、检索、管理、并发控制等功能的核心组件。它决定了数据的存储结构、性能、事务支持以及数据恢复能力。选择合适的存储引擎对于数据库的性能和可靠性至关重要,因此在设计数据库时需要根据具体的应用场景、数据需求和性能要求来选择合适的存储引擎。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言