其实很多文章都说了,InnoDB 是基于行锁设计同时支持事务和外键,MyISAM 是基于表锁设计,不支持事务和外键,Memory是内存数据库(可以想象成Memcache)等这些不同数据库之间的差异。
而今天我就说说这三种数据库其他的差异。
InnoDB:
1.InnoDB存储引擎支持事务,其设计目标主要是面向在线事务处理(OLTP)的应用
2.InnoDB存储引擎的表单独存放到一个独立的ibd文件中,此外InnoDB存储引擎支持用裸设备用来建立其表空间。(如果通过参数innodb_file_per_size设置成每个表一个表空间,只是表数据在不同的ibd文件,但它们还是有一个共享表空间还存储表结构等数据)。
3.InnoDB使用多版本并发控制(MCVV)来获得高并发性,并实现SQL标准的4种事务隔离级别同时使用一种Next-key Locking(解析锁)的策略避免幻读 (如果想了解什么是Next-key Locking 或者其他锁,可以去订阅 "架构师之路" InnoDB 专栏,里面有很详细的解释)
4.InnoDB提供 插入缓冲,二次写,自适应哈希索引等高性能和高可用功能
5.InnoDB存储引擎采用了聚集的方式,因此每个表的存储都是按照主键的顺序进行存放
6.InnoDB 聚集索引 存储整行数据
7.InnoDB 非常依赖缓存池(innodb_buffer_pool_size)。缓存池会缓存数据页,索引数据,表结构等数据
MyISAM:
1.MyISAM 聚集索引 不存储整行的数据,存储行数据的指针(虽然和InnoDB一样底层都是B+,但InnoDB存储了整行的数据)
2.MyISAM 主要面向OLAP数据库应用。
3.它的缓冲池只缓存索引,而不缓存行数据(key_buffer_size)
4.MyISAM 表由MYD 和 MYI组成, MYD用来存放数据问题,MYI用来存放索引文件
5.MyISAM存储引擎,其锁是表锁设计。并发读没有问题,但并发插入时,性能就要差一些。若只是底部插入。还是由一定的并发性
Memory:
1.Memory 将表中的数据存放在内存种,如果数据库重启或崩溃,表中数据都将消失。适合存储临时数据
2.Memory存储默认使用哈希索引,而不是B+树(与InnoDB 和 MyISAM不同)
3.Memory存储引擎作为临时表来存放查询种的中间结果集,如果中间结果集大于Memory存储引擎表的容量,又或者结果含有TEXT或BLOB列类型的字段,则MySQL数据库会把其转换到MyISAM存储引擎表而放到磁盘中
来自《MySQL技术内幕 InnoDB存储引擎》