clean code

i create stuff

MyISAM与InnoDB区别

| Comments

MyISAM和InnoDB是MySQL两种最常用的存储引擎,最近几次面试都有问到区别,感觉答得不好,今天专门抽时间研究下。

设计目标

InnoDB设计目标是处理大容量的数据,而MyISAM追求的是性能,两者产生的差异也是基于这点。 InnoDB是MySQL的默认存储引擎。

事务处理

InnoDB支持事务和外键,MyISAM不支持。MyISAM强调的是性能,InnoDB支持的功能更加完整。InnoDB支持事务带来了一个好处,发生故障时可以通过事务日志来恢复数据库,MyISAM特别要命的一点是崩溃后不能安全恢复,所以对于表比较大的情况不要用。

效率和锁

两种存储引擎的效率差异来自于锁的方式差异,MyISAM是表锁,对数据库进行写操作时会锁住整个表,效率很低;确定要修改数据的范围时,InnoDB是行锁,只锁一行的数据,写操作很快。但也有特例,比如UPDATE student SET age=10 WHERE name LIKE '王%',这种情况不能确定要UPDATE的行位置,InnoDB同样会锁住整个表。

索引

MyISAM支持全文索引,InnoDB不支持。

COUNT(*)

MyISAM保存了表的行数,InnoDB没有。也就是说,执行SELECT COUNT(*) FROM student的操作时,MyISAM可以直接给出结果,而InnoDB要先扫描全表。不过对于加了where条件的查询操作,效果是一样的。

AUTO_INCREMENT

InnoDB下只能对自增字段单独建索引,MyISAM下可以和其它列一起建联合索引。

然并卵

上面都是从网上东拼西凑总结出来的,有些博客相互还有冲突,醉了。有一点我特别奇怪,为什么MyISAM是表锁,InnoDB是行锁,MyISAM比InnoDB读性能还会好呢?搜了好多地方都没找到答案,老大苏武说其实不一定,只是某些情况会快一些,而且用MyISAM的人少。刚好最近我看公司的wiki,公司内部是强制用InnoDB做存储引擎的,我猜可能是出于事务和数据恢复的考虑。
还有其它一些区别,不一一列出来了。感觉这篇博客还有要完善的地方,不过基本的知识点已经涉及到了,有空再进一步研究吧。

瞎扯

实习一个多月了,很多零散的东西都在印象笔记里,加上面了几家公司,有很多想总结整理的东西。这周立了个flag,一天一篇博客,希望能不食言。

参考资料
[1] MyISAM InnoDB 区别
[2] MySQL存储引擎MyISAM与InnoDB的主要区别对比
[3] MySQL: InnoDB 还是 MyISAM?
[4] 《高性能MySQL》

Comments