MyISAM与InnoDB引擎

首先,Mysql的引擎除了InnoDB和MyISAM还有很多,这两个相对比较出名,5.5以前默认是MyISAM,而5.5以后默认是InnoDB,除了这两个引擎,还有Memory、CSV、Archive、Blackhole等等,具体可以参考官网Alternative Storage Engines

概述

直接引用官网上的概述:

对于MyISAM的场景说的很明确,“used in read-only or read-mostly workloads in Web and data warehousing configurations.”也就是说在只读的场景中比较合适。而Innodb更适合一般的场景,事务特性,多用户并发等。

比较

MyISAM与InnoDB对两者的比较,参考wikiComparison of MySQL database engines:

crash后恢复性能InnoDB较好。

InnoDB在每次事务处理后刷新事务日志,而MISAM需要依赖文件系统才能获得可靠性。

在批量插入的时候,此配置有用,可以在批量插入结束后关闭此配置。类似的,很多系统都有用可靠性换取速度的配置,如ceph的replica设置,kafka、Hbase返回时最小写入副本数目的设置。

InnoDB对并行插入有批量flush的操作,类似于Kafka。而MyISAM此操作依赖文件系统。

很关键的一点,如果主键是连续的,那么InnoDB在磁盘上插入也是会连续的,这对于插入比较多的场景,主键选取上最好要是单调的,写入速度会有很大提升。

压缩上,InnoDB的是可更新的。

一个关键的数据,对于一般的磁盘设备,1s也就是200多个update事务,因为受到了磁盘IO的限制。

MyISAM在updates和deletes行的时候,是对表加的锁,而InnoDB是用的行锁,锁的粒度小,并发当然好点。

数据结构比较

这篇文章MySQL索引背后的数据结构及算法原理对两个引擎数据结构有比较详细的分析,两者都使用了流弊的B+树(Hbase也用B+树),不同点是,MyISAM叶子节点存储的是数据指针,而InnoDB叶子节点直接存储了数据。使用B+树原因是因为要照顾磁盘缓慢的IO速度,而且利用了磁盘预读相对快(顺序读取快)的机制,所以B+树与数据库比较搭配。

MyISAM索引结构:

InnoDB结构:

参考

MyISAM Storage Engine
Introduction to InnoDB
Introduction to InnoDB
MySQL和Lucene索引对比分析

Table of Contents