MySQL中常用的存储引擎有四种,分别是MyISAM、InnoDB、MEMORY、ARCHIVE。下面依次来对这几种存储引擎做一些总结对比。
MyISAM
在5.5.5版本之前这是MySQL的默认存储引擎,不支持数据库事务,不支持行级锁和外键。所以它在插入数据时需要锁定整张表,效率较低。
但是相对于InnoDB,它的优点在于存储了表的行数,在查询数据条数的时候可以直接读取,不用再查询整张表。如果读的操作远远多于写操作,可以采用这种引擎。
优点:空间占用少,处理的速度快,表存储成文件格式,便于跨平台。
缺点:不支持事务的完整性和并发性。
InnoDB
它的设计目标是为了处理大容量数据库系统,它本身就是基于SQL后台的完整数据库系统,MySQL运行Innodb会在内存中建立缓冲池,用于缓冲数据和索引。
但是它没有保存存储表的行数,当执行查询表行数语句时需要扫描整个数据表,效率较慢。但是在做插入(insert)和更新(update)操作时,因为其支持事务等特性,效率就会更高一些。
应用场景:
- 如果需要对事务的完整性要求比较高(如银行)、对并发控制有需求(如售票)。应该选择InnoDB。
- 如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
优点:提供了对数据库事务ACID的支持,
实现了SQL标准的四种隔离级别,
提供了行级锁和外键约束。
缺点:读写效率较差,占用的空间相对较大。
MEMORY
这种引擎相对于前面的一些存储引擎,有些不一样,它的数据存储再内存中。
每一个基于memory的存储引擎的表实际对应一个磁盘文件,其文件名和表名一样。类型为.frm。文件中只存储表的结构,数据文件在内存中存储。所以对表中数据的操作就非常快。
memory存储引擎默认使用的hash索引,速度要比使用B-+Tree要快。如果要使用B树需要在建表的时候引用。
它数据存储的特殊性也导致了当MySQL进程异常时,关机或重启都会导致数据消失,所以基于memory存储引擎中的表生命周期都很短。
ARCHIVE
这种引擎会用zlib对表数据做压缩,所以它更节约磁盘I/O,同样多的数据量,Archive存储引擎比MyISAM、InnoDB更加节约存储空间。
不支持对数据的修改,它可以存储一些不用修改特殊的数据,如:日志类,不会再改变的数据信息。
Archive支持高并发的插入操作,但是本身不是事务安全的。
注意:同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。如果数据库中还有一部分只做写操作的数据块可以使用Archive,节省空间