Mysql存储引擎
MyISAM
特性
- 不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用
- 表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能
- 读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读
- 只会缓存索引:MyISAM可以通过key_buffer缓存以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据
适用场景
- 不需要事务支持(不支持)
- 并发相对较低(锁定机制问题)
- 数据修改相对较少(阻塞问题)
- 以读为主
- 数据一致性要求不是非常高
MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问
InnoDB
特性
- 具有较好的事务支持:支持4个事务隔离级别,支持多版本读
- 行级锁定:通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响
- 读写阻塞与事务隔离级别相关
- 具有非常高效的缓存特性:能缓存索引,也能缓存数据
- 整个表和主键以Cluster方式存储,组成一颗平衡树
- 所有Secondary Index都会保存主键信息
适用场景
- 需要事务支持(具有较好的事务特性)
- 行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
- 数据更新较为频繁的场景
- 数据一致性要求较高
- 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO
NDBCluster
是MySQL的高可用性解决方案
特性
- 分布式:分布式存储引擎,可以由多个NDBCluster存储引擎组成集群分别存放整体数据的一部分
- 支持事务:和Innodb一样,支持事务
- 可与mysqld不在一台主机:可以和mysqld分开存在于独立的主机上,然后通过网络和mysqld通信交互
- 内存需求量巨大:新版本索引以及被索引的数据必须存放在内存中,老版本所有数据和索引必须存在与内存中