碧海长天

好看的皮囊千篇一律,有趣的灵魂万里挑一。

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秒
    WX20171220-102608.png

    第二张是查询MYISAM的 4毫秒
    WX20171220-102748.png

    两者根本不在一个数量级上,这是最好的证明。 当然如果不是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。

总结,以上只是原则上的问题。是建表时需要考虑的。实际情况复杂多样,常常面临抉择与牺牲。这时候就要根据对业务方向对判断来建表了,但后期维护时,也经常会遇到修改表结构但情况。



标签: 后端开发 mysql

发表评论: