MySQL各种存储引擎对比

六月ゝ 毕业季﹏ 提交于 2020-04-06 04:04:45

欢迎观看 {无双}(wushuang) 的读书笔记,您可以通过订阅 无双的公众号或微博或头条号 持续关注最新的文章。

头条号ID:1656865998770190

微信公众号:落叶飞翔的蜗牛

开源中国博客:https://my.oschina.net/zhouguanya

QQ:3190976240

MySQL数据库区别于其他数据库的最重要的一个特点是其插件式的存储引擎。

MySQL各类存储引擎

InnoDB存储引擎

从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。

InnoDB存储引擎支持事务,其设计目标主要是面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。

InnoDB通过使用多版本并发控制MVCC来获取高并发性,并且实现了SQL标准的4种隔离级别,默认为repeatable级别。同时,使用一种称为next-key locking的策略避免幻读现象的产生。除此之外,InnoDB存储引擎还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。

对于表中存储的数据,InnoDB存储引擎采用聚集的方式,每张表的存储都是按照主键的顺序进行存放的。如果没有显示的在定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID作为主键。

MyISAM存储引擎

MyISAM存储引擎不支持事务、表锁设计,支持全文索引。在MySQL5.5.8版本前MyISAM存储引擎是默认的存储引擎。

MyISAM存储引擎由MYD和MYI组成,MYD用于存放数据,MYI用于存放索引。可以通过myisampack工具来进一步压缩数据,因为myisampack工具使用哈夫曼编码静态算法来压缩数据。

在MySQL5.0前的版本,MyISAM默认支持的表大小为4GB,如果需要支持大于4GB的MyISAM表时,需要定制MAX_ROWS和AVG_ROW_LENGTH属性。从MySQL5.0版本开始,MyISAM默认支持256TB单表数据。

MyISAM存储引擎表,MySQL数据库只缓存索引文件,数据文件的缓存交由操作系统本身完成。这与其他使用LRU最近最少使用算法缓存数据的大部分数据库大不相同。此外,在MySQL 5.1.23版本之前,无论是32位或64位操作系统,缓存索引的缓冲区最大只能设置为4GB。在此之后的版本中,64位操作系统可以支持大于4GB的索引缓冲区。

NDB存储引擎

NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC集群。

NBD存储引擎是一个集群存储引擎,类似于Oracle的RAC集群。与Oracle RAC share everything架构不同的是,其结构是share noting的集群架构。因此可以提供更高的可用性。NDB的特点是数据全部放在内存中,因此主键查找的速度极快。并且通过添加NDB数据存储节点可以线性提高数据库性能,是高可用、高性能的集群系统。

NDB存储引擎的连接操作JOIN是在MySQL数据库层完成的,并非在存储引擎层完成的。因此复杂的连接操作需要巨大的网络开销,查询速度很慢。

Memory存储引擎

Memory存储引擎将表中的数据存放在内存中,如果数据库发生重启或崩溃,表中的数据都会丢失,适用于存储临时数据的临时表以及数据仓库维度的维度表。Memory存储引擎默认使用哈希索引。

虽然Memory存储引擎速度快,但是在使用时有一定的限制。如只支持表锁,并发性能较差,不支持TEXT和BLOB等类型。最重要的是,Memory存储引擎存储边长字段时,按照定长字段的方式进行存储,会浪费内存。

Archive存储引擎

Archive存储引擎只支持INSERT和SELECT操作,从MySQL5.1开始支持索引。Archive存储引擎使用zlib算法将数据行进行压缩后存储,压缩比可以达到1:10。Archive存储引擎非常适合存储归档数据,如日志信息。

Federated存储引擎

Federated存储引擎表不存储数据,只是指向远程MySQL数据库服务器上的表。类似于SQL Server的链接服务器和Oracle的透明网关。

Maria存储引擎

Maria存储引擎是新开发的存储引擎。主要目的是取代原有的MyISAM存储引擎。Maria存储引擎的特点是支持缓存数据和索引文件,应用了行锁设计,提供了MVVC功能,支持事务和非事务安全选项。

常见误区

MySQL数据库速度快是因为不支持事务?

错!虽然MySQL的MyISAM存储引擎不支持事务,但是InnoDB存储引擎支持事务。“快”是相对于不用应用来说的。对弈ETL这种操作,MyISAM存储引擎有其优势,但在OLTP环境中,InnoDB存储引擎效率更高。

当表的数据量大于1000万时MySQL的性能会急剧下降吗?

不!MySQL是数据库,不是文件,随着数据行的增加,性能当然会有所下降。但是这些下降不是线性的。如果用户选择正确的存储引擎,以及正确的配置,再多的数据量MySQL也能承受。

各种存储引擎之间的比较

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!