MyISAM
- 特性
不支持事务 : MyISAM 存储引擎不支持事务, 所以对于事务有要求的业务场景不能使用 .
表级锁定 : 其锁定机制是表级索引 , 这虽然可以让锁定的实现成本很小 , 但是也同时大大降低了其并发性能 .
读写互相阻塞 : 不仅会在写入的时候阻塞读取 , MyISAM 还会在读取的时候阻塞写入 , 但读本身并不会阻塞另外的读 .
只会缓存索引 : MyISAM 可以通过 key_buffer 缓存以大大提高访问性能减少磁盘 IO , 但是这个缓存区只会缓存索引 , 而不会缓存数据 . - 使用场景
不需要事务支持(不支持)
并发相对较低(锁定机制问题)
数据修改相对较少(阻塞问题)
以读为主
数据一致性要求不是非常高 - 最佳实践
尽量索引(缓存机制)
调整读写优先级 , 根据实际需求确保重要操作更优先
启用延迟插入改善大批量写入性能
尽量顺序操作 , 让 insert 数据都写入到尾部 , 减少阻塞
分解大的操作 , 降低单个操作的阻塞时间
降低并发数 , 某些高并发场景通过应用来进行排队机制
对于相对静态的数据 , 充分利用 Query Cache 可以极大的提高访问效率
MyISAM 的 count 只有在全盘扫描的时候特别高效 , 带有其他条件的count 都需要进行实际的数据访问InnoDB
- 特性
具有较好的事务支持 :支持4个事务隔离级别, 支持多版本读
行级锁定 : 通过索引实现 , 全盘扫遍依然会表锁 , 注意间隙锁的影响
读写阻塞与实务隔离级别相关
具有非常搞笑的缓存特性 : 能缓存索引 , 也能缓存数据
整个表的主键以 Cluster 方式存储 , 组成一颗平衡树
所有Secondary Index 都会保存主键信息 - 使用场景
需要事务支持(具有较好的事务特性)
行级锁定对高并发有很好的适应能力 , 但需要确保查询是通过索引完成
数据更新较为频繁的场景
数据一致性要求较高
硬件设备内存较大 , 可以利用 InnoDB 较好的缓存能力提高内存利用率 , 尽可能的减少磁盘 IO - 最佳实践
主键尽可能小 , 避免给Secondary index带来过大的空间负担
全表扫描 , 因为会使用表锁
尽可能缓存素有的索引和数据 , 提高响应速度
在大批量插入的时候 , 尽量自己控制事务而不要使用 autocommit 自动提交
合理设置innodb_flush_log_at_trx_commit
参数值 , 不要过度追求安全性
避免主键更新 , 因为这会带来大量的数据移动NDBCluster
- 特性
分布式 : 分布式存储引擎 , 可以由多个 NDBCluster 存储引擎组成集群分别存放整体数据的一部分
支持事务 : 和InnoDB一样 , 支持事务
可与 mysqld 不在一台主机 : 可以和 mysqld 分开存在于独立的主机上 , 然后通过网络和 mysqld 通信交互
内存需求量巨大 : 新版本索引以及被索引的数据必须存放在内存中 , 老版本所有数据和索引必须存在与内存中 - 使用场景
具有非常高的并发需求
对单个请求的响应并不是非常的 critical 查询简单 , 过滤条件较为固定 , 每次请求数据量较少 , 又不希望自己进行水平Sharding - 最佳实践
尽可能让查询简单 , 避免数据的跨节点传输
尽可能满足SQL节点的计算性能 , 大一点的集群 SQL节点会明显多于 Data 节点
在各节点之间尽可能使用万兆网络环境互联 , 以减少数据在网络层传输过程中的延时
注 : 以上三个存储引擎是目前相对主流的存储引擎 , 还有其他类似如 : Memory , Merge , CSV , Archive 等存储引擎的使用场景都相对较少 , 这里就不一一的分析了 .