MySQL的存储引擎对比
mysql的每个存储引擎都是有其各自的特点,根据具体的应用建立不同的存储引擎表,由于mysql是开源的我们可以通过修改源码来进行二次开发。注意:存储引擎是基于表的,不是数据库
InnoDB存储引擎
1.支持事务,主要面向事务处理(OLTP)的应用
2.支持外键
3.支持行级锁,三种行锁算法(Record Lock,Gap Lock,Next-Key Lock)
4.通过多版本并发控制(MVCC)支持高并发性,4种隔离级别(未提交读,已提交度,可重复读[默认],可序列化)
5.表单独存放到独立的.ibd文件中,表中的数据存储采用聚集(clusterde)方式,每张表都是按主键顺序进行存放,如果没有在表定 义时声明主键,将会为其生成一个6字节ROWID作为主键。
MyISAM存储引擎
1.不支持事务,不支持外键,主要面向一些OLAP数据库应用
2.表锁设计
3.支持全文索引
4.表由MYD和MYI文件组成,MYD存放数据文件,MYI存放索引文件
通常用于只读或大部分读取工作,如报表等
NDB存储引擎
NDB存储引擎是一个集群存储引擎,其结构为share nothing集群架构,数据全部存放在内存中(mysql5.1后支可将非索引数据放在磁盘上),因此主键查找速度极快,并且通过添加NDB数据存储节点(Data Node)可以线性的提高数据库性能。特别适用于需要高可用的应用程序
NDB存储引擎的连接(join)操作是在mysql数据库层完成的,而不是在存储引擎层完成,所以复杂的连接操作需要巨大的网络开销,查询速度会很慢。
Memory存储引擎
Memory存储引擎将表中的数据存放在内存中,如果重启数据会消失,适合存储临时数据的临时表,默认索引使用hash索引。
Memory存储引擎虽然速度非常快,但是支持表锁,并发性能差,存储变长字段varchar时是按照定长字段char来进行的,因此会浪费内存。
如果使用Memory存储引擎作为临时表存放数据时,当数据集大于Memory存储引擎表的容量设置,或结果集中包含text或blob类型字段,mysql会把其转换为MyISAM存储引擎
Archive存储引擎
Archive存储引擎只支持insert和select操作,5.1之后支持索引,使用zlib算法将数据行压缩存储,适合存储归档数据,如日志。
使用行锁实现高并发插入操作,但本身不支持事务,主要提供高速插入和压缩功能
Maria存储引擎
Maria存储引擎是新开发的一个引擎,设计目标是为了取代MyISAM的,可以看作MyISAM的后续版本,与MyISAM不同的是,支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务的选项,和更好的blob字符类型的处理性能
各存储引擎比较
特点 | InnoDB | MyISAM | Memory | Archive | NDB |
---|---|---|---|---|---|
存储限制 | 64TB | 256TB | RAM | 没有 | 有 |
事务安全 | 支持 | - | - | - | - |
锁机制 | 行锁 | 表锁 | 表锁 | 行锁 | 行锁 |
B树索引 | 支持 | 支持 | 支持 | - | 支持 |
哈希索引 | - | - | 支持 | - | 支持 |
全文索引 | - | 支持 | - | - | - |
集群索引 | 支持 | - | - | - | - |
T树索引 | - | - | - | - | 支持 |
数据缓存 | 支持 | - | 支持 | - | 支持 |
索引缓存 | 支持 | 支持 | 支持 | - | 支持 |
数据可压缩 | - | 支持 | - | 支持 | - |
空间使用 | 高 | 低 | N/A | 非常低 | 低 |
内存使用 | 高 | 低 | 中 | 低 | 高 |
批量插入速度 | 低 | 高 | 高 | 非常高 | 高 |
支持外键 | 支持 | - | - | - | - |
MVCC | 支持 | - | - | - | - |
备份/时间点恢复 | 支持 | 支持 | 支持 | 支持 | 支持 |