MYISAM和InnoDB比较。
2017-5-20
先给结论:这两种类型的表各有优劣,具体使用应根据应用而定。
基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
接下来的具体不同的说明。
1.InnoDB中不保存表的具体行数,而MYISAM对是单独存起来的。也就是说select count(*) from table 时,MYISAM会比InnoDB快的多。
我做过比较。同样的两张表内,有同样的1亿条数据。使用select count(*) from table,实验查询的时间。
第一张是查询InnoDB的。 22.2秒
第二张是查询MYISAM的 4毫秒
两者根本不在一个数量级上,这是最好的证明。 当然如果不是1亿条数据,而是10条。 那就没多少区别了~
2. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
3. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;这没什么好说的,想用外键的话,就用InnoDB
4.InnoDB不支持FULLTEXT类型的索引。 但mysql对中文分词不太友好,所以全文索引对我来说也一直没什么用处。因为还需要分词后再存储。还不如用ElasticSearch呢。可参考我开发对ElasticSearch插件哦。 http://www.slidyy.com/post-26.html 分词、查询、存储、日志强大对搜索引擎。
5.InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。 个人认为,这才是大多数人吐槽MYISAM对原因吧。因为事务功能可以通过代码弥补。但锁表可是性能但罪魁祸首。
因此,高并发插入但情况下,innodb完胜MYISAM。但若是只读的化,因为是共享锁,不影响查询,倒也没什么影响。所以,要根据业务需求来定制表类型。
即:insert、update多的用innodb。select delete多的用MYISAM。
总结,以上只是原则上的问题。是建表时需要考虑的。实际情况复杂多样,常常面临抉择与牺牲。这时候就要根据对业务方向对判断来建表了,但后期维护时,也经常会遇到修改表结构但情况。