InnoDB和MyISAM是不少人在使用MySQL时最经常使用的两个表类型,这两个表类型各有优劣,5.7以后就不同了mysql
一、事务和外键sql
InnoDB具备事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。若是应用中须要执行大量的INSERT或UPDATE操做,则应该使用InnoDB,这样能够提升多用户并发操做的性能
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。若是应用中须要执行大量的SELECT查询,那么MyISAM是更好的选择缓存
二、全文索引安全
Innodb不支持全文索引,若是必定要用的话,最好使用sphinx等搜索引擎。myisam对中文支持的不是很好并发
不过新版本的Innodb已经支持了高并发
三、锁性能
mysql支持三种锁定级别,行级、页级、表级;搜索引擎
MyISAM支持表级锁定,提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)spa
InnoDB支持行级锁,InnoDB表的行锁也不是绝对的,若是在执行一个SQL语句时MySQL不能肯定要扫描的范围,InnoDB表一样会锁全表,注意间隙锁的影响操作系统
例如update table set num=1 where name like “%aaa%”
四、存储
MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型, .frm文件存储表定义,数据文件的扩展名为.MYD, 索引文件的扩展名是.MYI
InnoDB,基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操做系统文件的大小
注意:MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去很多的麻烦
五、索引
InnoDB(索引组织表)使用的聚簇索引、索引就是数据,顺序存储,所以能缓存索引,也能缓存数据
MyISAM(堆组织表)使用的是非聚簇索引、索引和文件分开,随机存储,只能缓存索引
六、并发
MyISAM读写互相阻塞:不只会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读自己并不会阻塞另外的读
InnoDB 读写阻塞与事务隔离级别相关
七、场景选择
MyISAM
InnoDB
八、其它细节
1)InnoDB 中不保存表的具体行数,注意的是,当count(*)语句包含 where条件时,两种表的操做是同样的
2)对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,可是在MyISAM表中,能够和其余字段一块儿创建联合索引, 若是你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增加计数器的计数器,它被用在为该列赋新值。自动增加计数器仅被存储在主内存中,而不是存在磁盘
3)DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的删除
4)LOAD TABLE FROM MASTER操做对InnoDB是不起做用的,解决方法是首先把InnoDB表改为MyISAM表,导入数据后再改为InnoDB表,可是对于使用的额外的InnoDB特性(例如外键)的表不适用
5)若是执行大量的SELECT,MyISAM是更好的选择,若是你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表
七、为何MyISAM会比Innodb 的查询速度快
InnoDB 在作SELECT的时候,要维护的东西比MYISAM引擎多不少;
1)InnoDB 要缓存数据和索引,MyISAM只缓存索引块,这中间还有换进换出的减小
2)innodb寻址要映射到块,再到行,MyISAM记录的直接是文件的OFFSET,定位比INNODB要快
3)InnoDB 还须要维护MVCC一致;虽然你的场景没有,但他仍是须要去检查和维护
MVCC ( Multi-Version Concurrency Control )多版本并发控制
InnoDB :经过为每一行记录添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据什么时候被建立,另一个记录这行数据什么时候过时(或者被删除)。可是InnoDB并不存储这些事件发生时的实际时间,相反它只存储这些事件发生时的系统版本号。这是一个随着事务的建立而不断增加的数字。每一个事务在事务开始时会记录它本身的系统版本号。每一个查询必须去检查每行数据的版本号与事务的版本号是否相同。让咱们来看看当隔离级别是REPEATABLE READ时这种策略是如何应用到特定的操做的
SELECT InnoDB必须每行数据来保证它符合两个条件
一、InnoDB必须找到一个行的版本,它至少要和事务的版本同样老(也即它的版本号不大于事务的版本号)。这保证了不论是事务开始以前,或者事务建立时,或者修改了这行数据的时候,这行数据是存在的。
二、这行数据的删除版本必须是未定义的或者比事务版本要大。这能够保证在事务开始以前这行数据没有被删除。
八、mysql性能讨论
MyISAM最为人垢病的缺点就是缺少事务的支持
InnoDB 的磁盘性能很使人担忧
MySQL 缺少良好的 tablespace
……