存储引擎及MyISAM和InnoDB和MEMORY区别和特点

一.存储引擎

存储引擎:
存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式。

存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型。

Oracle,SqlServer等数据库只有一种存储引擎。MySQL提供了插件式的存储引擎架构。所以MySQL存在多种存储引擎,可以根据需要使用相应引擎,或者编写存储引擎。

1.1 InnoDB

从MySQL5.5.8,InnoDB成为MySQL默认的存储引擎。MySQL从3.23.34a开始支持InnoDB。

InnoDB支持事务,主要面向OLTP数据库应用。支持行锁,支持外键,并支持类似于Oracle的行锁定读,即默认读取操作不会产生锁。

InnoDB存储引擎中支持自动增长列AUTO_INCREMENT。自动增长列的值不能为空,且值必须唯一,且必须为主键。在执行插入操作时,若不指定自动增长列的值,或自动增长列的值为0或NULL,则插入的值为自动增长后的值。

若插入任意值,该值在该列中没有出现过,则可以直接插入。

InnoDB存储引擎中,创建的表的结构存储于.frm文件中。数据和索引存储在innodb_data_home和innodb_data_path表空间中。

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

InnoDB支持外键。外键所在的表为子表,外键依赖的表为父表。父表中被主表外键支持的字段必须为主键。当删除、更新浮标的某条信息时,子表也必须有相应的改变。

InnoDB通过多版本并发控制(MVCC)来获得高并发性,并实现了SQL标准的4种隔离机制,默认为REPEATABLE级别。同时使用一种被称为next-key locking的策略来避免幻读。InnoDB还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。

1.2 MyISAM

MySQL5.5.8之前MyISAM是MySQL默认的存储引擎。

MyISAM不支持事务,不支持外键,支持全文索引,处理速度快。主要面向OLAP数据库应用。

MyISAM存储引擎的表存储成3个文件,文件名与表名相同,扩展名分别为:frm,MYD,MYI。

frm文件:存储表的结构。
myd文件:存储数据。
myi文件:存储存储索引。
MySQL 5.0版本之前,MyISAM默认支持的表大小为4GB,若需要支持大于4GB的MyISAM表时,则需要指定MAX_ROWS和AVG_ROW_LENGTH属性。从MySQL5.0开始,MyISAM默认支持256T的单表数据。

MyISAM的缓冲池只缓存索引文件,而不缓存数据文件。数据文件的缓存交给操作系统完成。这与大多数使用LRU算法缓存数据的数据库都不同。在MySQL5.1.23之前,无论32位系统或64位系统,缓存最大只能设置为4GB,在之后的版本中,64位的系统可以支持大于4GB的索引缓冲区。

1.3 MEMORY

MEMORY存储引擎(之前被称为HEAP存储引擎)将表中的数据存储在内存中。表结构以文件存储于磁盘。文件名与表名相同,后缀名为frm。服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要使用了,可以释放这些内容,或删除不需要的表。

MEMORY存储引擎默认使用哈希索引,可以按需求指定索引类型。

只支持表锁,并发性能较差。不支持VARCHAR、BLOB和TEXT的列类型。

MEMORY存储引擎通常很少用到。由于基于内存,所以响应速度非常快。但若内存出现异常就会影响到数据的完整性。若重启机器或者关机,或当mysqld守护进程崩溃时,所有的MEMORY数据都会丢失。

MEMORY表的大小主要取决于两个参数,分别是max_rows和max_heap_table_size:

max_rows可以在创建表时指定;
max_heap_table_size的大小默认为16MB,可以按需要进行扩大。
若数据超过了设置的值,则MySQL数据库会把其转换到MyISAM存储引擎表,存放在磁盘中。这导致访问性能的降低。

当数据有如下情况时,可以考虑使用MEMORY表:

临时的数据:目标数据只是临时需要,在其生命周期中必须立即可用。
相对无关的数据:存储在MEMORY表中的数据如果突然丢失,不会对应用服务产生实质的负面影响,而且不会对数据完整性有长期影响。
如果使用MySQL4.1及以之前版本,MEMORY的搜索比MyISAM表的搜索效果要低,因为MEMORY表只支持哈希索引,这需要使用整个键进行搜索。但是,4.1之后的版本同时支持散列索引和B树索引。B树索可以使用部分查询和通配查询,也可以使用 < 、> 和 >= 等操作符。

1.4 NDB

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

NDB的特点是主键查找速度极快,并通过添加NDB数据存储节点可以线性的提交数据库性能,是高可用,高性能的集群系统。

NDB存储引擎有一个问题,即其查询连接操作是在数据库层完成的,而不是存储引擎完成的。这意味着,复杂的连接操作需要巨大的网络开销,因此返回擦洗速度很慢。

1.5 Archive

Archive存储引擎只支持INSERT和SELECT操作,从MySQL5.1开始支持索引。

Archive存储引擎使用zlib算法将数据和进行压缩后存储,压缩比可达1:10。Archive存储引擎非常适合存储归档数据。Archive使用行锁啊来实现高并发的插入操作,但不支持事务。

1.6 Federated

Federated存储引擎不存放数据,只是指向一台远程MySQL数据库服务器上的表。

1.7 Maria

Maria存储引擎是新开发的引擎,用于取代原有的MyISAM。支持缓存数据和索引文件,应用行锁设计,提供MVCC功能,支持事务和非事务安全的选项,以及更好的BLOB字符类型的处理性能。

1.8 其他存储引擎

MySQL还有很多其他的存储引擎,包括Merge,CVS,Sphinx,Infobright,它们各自有各自的使用场合。

二. MyISAM和InnoDB和MEMORY区别

MySQL常见的三种存储引擎为InnoDBMyISAMMEMORY。其区别体现在事务安全存储限制空间使用内存使用插入数据的速度对外键的支持。具体如下:
存储引擎及MyISAM和InnoDB和MEMORY区别和特点_第1张图片

1、事务安全:

InnoDB支持事务安全,MyISAM和MEMORY两个不支持。

2、存储限制:

InnoDB有64TB的存储限制,MyISAM和MEMORY要是具体情况而定。

3、空间使用:

InnoDB对空间使用程度较高,MyISAM和MEMORY对空间使用程度较低。

4、内存使用:

InnoDB和MEMORY对内存使用程度较高,MyISAM对内存使用程度较低。

5、插入数据的速度:

InnoDB插入数据的速度较低,MyISAM和MEMORY插入数据的速度较高。

6、对外键的支持:

InnoDB对外键支持情况较好,MyISAM和MEMORY两个不支持外键。

三种引擎特点如下:

1、InnoDB存储引擎

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,MySQL5.5以后默认使用InnoDB存储引擎。

InnoDB特点: 支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。

如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

2、MyISAM存储引擎

MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。

MyISAM特点: 插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用

3、MEMORY存储引擎

MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。

MEMORY特点: 所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。

它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

你可能感兴趣的:(mysql)