MySQL数据库中三种常用存储引擎的性能比较
MySQL的存储引擎可能是所有关系数据库产品的最显著的特性。不仅可以同时使用多个存储引擎,而且每个存储引擎的插件与MySQL之间的耦合关系非常松散。由于各存储引擎的功能特点不同,本文主要介绍如何选择合适的存储引擎来处理不同的业务场景。
MyISAM
特征
交易不支持:MyISAM存储引擎不支持事务,所以业务场景所需的交易不能使用
表级锁定:它的锁机制是一个表级索引,它可以使锁实现成本小,但也大大降低了它的并发性能。
读写对方拦网:不仅阻塞读写的时候,MyISAM也会阻止同时读写,但阅读本身不会阻止其他阅读。
它只缓存索引:MyISAM可以提高访问性能和key_buffer缓存减少磁盘IO,但是这个缓存只缓存索引而不是缓存数据。
适用场景
不需要事务支持(不支持)
相对较低的并发性(锁机制问题)
数据修改相对较小(阻塞问题)
主要通过阅读来阅读
数据一致性要求不是很高。
最佳实践
尽可能多地索引(缓存机制)
调整读写优先级以确保基于实际需求的重要操作更为优先
启用延迟插入以提高质量写性能
尽可能将插入数据写入尾部,减少阻塞。
分解大型操作以减少单个操作的阻塞时间。
减少并发性,一些高并发场景通过应用程序排队。
对于相对静态的数据,充分利用查询缓存可以大大提高访问效率。
MyISAM算是高度有效的只有当全表扫描,并与其他条件计数需要访问实际数据
InnoDB
特征
良好的事务支持:支持4个事务隔离级别,支持多版本读取
行级锁定:通过索引实现,全表扫描仍将是表锁,注意间隙锁的影响
读写阻塞与事务隔离级别有关。
高效的缓存特性:缓存索引和缓存数据
整个表和主键以集群的方式存储,形成一个平衡树。
所有次要索引都将保存主键信息。
适用场景
需要事务支持(具有更好的事务特性)
行级锁对高并发性有很好的适应性,但必须保证索引完成查询。
频繁更新数据的场景
对数据一致性的高要求
硬件设备有一个大的内存,可以使用InnoDB的缓存来提高内存的利用率和减少磁盘IO的尽可能多的能力
最佳实践
主键尽可能小,以避免对次级索引造成很大的空间负担。
避免使用全表扫描,因为使用表锁。
尽可能地缓存所有索引和数据,以提高响应速度。
努力控制自己的交易小批量插入尽可能多,而不是使用自动提交提交自动
innodb_flush_log_at_trx_commit参数设置合理,不过分追求安全
避免主键更新,因为这会带来大量数据移动。
ndbcluster
特征
分布:分布式存储引擎,可以由几个ndbcluster存储引擎存储整个数据部分。
支持事务:如InnoDB,支持交易
不能在主机与mysqld:可以从一个单独的主机参数分离,然后通过网络沟通和mysqld
内存需求很大:新版本索引和索引数据必须存储在内存中。所有数据和索引的旧版本必须存在于内存中。
适用场景
具有很高的并发要求
对单个请求的响应不是很关键。
查询简单,过滤条件是相对固定的,数据量少,和切分的水平是不需要的。
最佳实践
尽量简化查询,避免跨节点传输数据。
尽可能地满足SQL节点的计算性能,较大的SQL节点集群显然是冗余的数据节点。
为了减少网络层中数据传输的延迟,在节点之间尽可能多地使用网络环境。
注意:上述三种存储引擎是相对主流的存储引擎,相对较少的其他存储引擎,如内存、合并、CSV和存档。