Mysql存储引擎(三)------常用存储引擎之间的对比
前言
一、 回顾
之前的文章简单的讲述了关于数据库存储引擎的定义和关于Mysql多种存储引擎之间的区别和联系。在这篇文中可以相对细化的讨论下Mysql中存储引擎的异同。这篇文章主要解决以下几个问题。
1、 Mysql常用存储引擎之间的功能差异图;
2、 细化讲解Mysql中的各个存储引擎的功能特性;
3、 总结Mysql存储引擎的优劣;
二、 分述
1、 Mysql常用存储引擎之间的功能差异图;
可以用一张图清晰明了的展示出Mysql的各种存储引擎之间的差异。图1,可以很清楚的了解到Mysql目前支持的存储引擎的情况。
图1:
图1展示了mysql支持的存储引擎中类有八中之多。其中InnoDB是mysql默认的存储引擎。以下用图2展示一下当前Mysql常用的各个存储引擎在功能之间的差 异。在我们今后使用的过程中可以游刃有余。
图2
在Mysql数据库开发的过程中MyISAM和InnoDB两种存储引擎使用相对其他更为广泛。在之前未接触过Mysql的小伙伴或许会有些惊讶,竟然有不支持 事务的存储引擎,学习过关系型数据库理论的小伙伴英国都知道,事务是关系型数据库的核心。但是在实际的应用中,为了提高性能,在特殊的场景下也是 可以摒弃事务的。在接下来的篇幅中将陆续介绍Mysql各个事务之间的差异。
2、 细化讲解Mysql中的各个存储引擎的功能特性;
这一小节分别介绍Mysql的各个存储引擎MyIsam,InnoDB等存储引擎之间的特性。
①、 MyISAM存储引擎:
MyISAM存储引擎是Mysql官方提供的默认存储引擎,它的特点是不支持事务,表锁和全文索引,对于一些OLAP系统,操作速度极快。每一个MyISAM在磁 盘上存储三个文件。文件名都和表名相同,扩展名分别为.frm(存储表定义)、.MYD(MYData,存储数据)、.MYI(MYIndex,存储索引)。这里需要特别注意的是MyISAM 不缓存数据文件,只缓存索引文件。
从MySQL5.1开始,MySQL引入了一个新的概念,插件式存储引擎体系结构。可以做到存储引擎层与SQL层各自更为独立,耦合更小,最重要的是方便了存储
引擎的加载与移出,可以做到运行时加载新的存储引擎,而不影响MySQL正常运行。所以,这增加了MySQL的灵活性,可以综合各种存储引擎的长处实现功能,可
以说是MySQL最强大的一面!
在这里再说明一点就是MyISAM的物理文件结构:
1)、 物理文件结构:
(1)任何存储引擎都不可或缺的存放表结构定义的.frm(Form)文件
(2)存放表数据的.MYD文件(My Data)
(3)存放索引数据的.MYI文件(My Index)
这里着重说一下.MYD文件的文件存放格式,分为静态固定长度、动态可变长度、压缩三种格式。表数据是默认不压缩的,在创建表时,可以通过
ROW_FORMAT设置默认为压缩{COMPRESSED|DEFAULT},也可以通过MyISAMpack工具进行压缩。当表数据没有被压缩时,静态与动态的区分就
与表中定义的字段类型有关了。当出现VARCHAR等可变长度类型时,这个表就是动态的;当没有出现任何可变长类型时,这个表就是静态的。
2)、支持的索引类型:
(1)BTree索引(最常见)
(2)R-Tree索引
(3)Full-Text索引
3)、 锁机制------支持表级锁定
4)、事务处理——为保证效率,不支持事务处理
5)、增删改查性能——SELECT性能较高,适合执行查询较多的情况使用
6)、COUNT(*)问题——MyISAM存储引擎记录表行数,所以在使用COUNT(*)时,只需取出存储的行数,而不用遍历表,效率较高
②、InnoDB存储引擎:
1)、InnoDB的物理文件结构:
(1)同MyISAM一样的是,InnoDB存储引擎也有.frm文件存储表结构定义
(2)与MyISAM不同的是,InnoDB的表数据与索引数据是存储在一起的,但在这个文件中每张表是独自占有一块表空间还是共享所有表空间,是由用户
决定的。如果独享表空间,每个表的表数据与索引数据都会存放在一个.ibd(innoDB data)文件中;如果是共享表空间,通过innodb_data_file_path
指定后,每次增加数据文件后必须停机重启才能生效,很不方便。
(3)InnoDB有支持事务及安全的日志文件,这个文件非常重要,InnoDB可以通过日志文件将数据库崩溃时已经完成但还没来得及将内存中已经修改但未
完全写入磁盘的数据写入磁盘,也可以把已部分完成并写入磁盘的未完成事务回滚,保证数据一致性。如果错误删除日志文件会导致数据库崩溃且
无法启动。
2)、支持的索引类型与MyISAM基本一致,但具体实现因为文件结构的不同有很大差异,具体差异参看上述博客。
3)、锁机制的改进——实现了行级锁,为承受高并发增加了竞争力。
4)、事务处理——实现了事务处理,可谓与MyISAM最重要的区别之一。
5)、增删改查性能——如果执行大量的增删改操作,推荐使用InnoDB存储引擎,它在删除操作时是对行删除,不会重建表。
6)、COUNT(*)问题——InnoDB存储引擎会遍历表以计算数量,效率较低。
7)、其他特点——实现了外键、提供了多版本数据的提取。
③、NDB存储引擎:
NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC,但它是Share Nothing的架构,因此能提供更高级别的高可用性和可扩展性。NDB的特点
是数据全部放在内存中,因此通过主键查找非常快。
关于NDB,有一个问题需要注意,它的连接(join)操作是在MySQL数据库层完成,不是在存储引擎层完成,这意味着,复杂的join操作需要巨大的网络开销,
查询速度会很慢。
④、Memory(Heap)存储引擎:
Memory存储引擎(之前称为Heap)将表中数据存放在内存中,如果数据库重启或崩溃,数据丢失,因此它非常适合存储临时数据。
⑤、 Archive存储引擎:
正如其名称所示,Archive非常适合存储归档数据,如日志信息。它只支持INSERT和SELECT操作,其设计的主要目的是提供高速的插入和压缩功能。
⑥、Federated存储引擎:
Federated存储引擎不存放数据,它至少指向一台远程MySQL数据库服务器上的表,非常类似于Oracle的透明网关。
⑦、Maria存储引擎:
Maria存储引擎是新开发的引擎,其设计目标是用来取代原有的MyISAM存储引擎,从而成为MySQL默认的存储引擎。
最后需要强调一点,虽然MySQL有非常多的存储引擎,但它们之间不存在优劣关系,而是根据不同的应用选择适合自己业务的存储引擎。如果你能力
够强,也可以自己修改或开发存储引擎,这不就是开源的魅力所在吗?
3、 总结Mysql存储引擎的优劣;
通过以上的学习了解到Mysql的各种存储引擎之间各有优劣,各有特点和不足,因此在了解到这些差异的情况下在今后的开发中就可以根据不同存储引擎差异使用 起来自然游刃有余,假如需要建一张表用于存储日志信息,那么我们就将这张表的存储引擎设置为Archive。
本文参照了以下文章:
http://www.cnblogs.com/Rozdy/p/4601861.html
http://blog.****.net/zhangliangzi/article/details/51379274