虽然标题是MySQL的数据库引擎对比
但是只对比最具代表性的MyISAM和InnoDB
1、最明显的区别
InnoDB支持事务处理,而MyISAM不支持
InnoDB支持行级锁,而MyISAM只支持表锁
InnoDB支持外键,而MyISAM不支持
既然如此,那MyISAM还有啥存在的必要?
MyISAM的优势在于能够提供比InnoDB更快速的“查询”功能。
毕竟,很多表都是写少读多。
很多资料说,MyISAM是MySQL的默认引擎
我觉得这么说不合适
一是默认引擎是可以设置的
二是因为我的MySQL默认引擎是InnoDB,好像我也没改过这个配置
2、文件结构
MyISAM的表有三个文件 .frm .myd .myi
分别是表定义文件、数据文件和索引文件。
InnoDB是两个文件,一个数据文件和一个日志文件。
如果只从这点考虑,MyISAM的insert和update性能不如InnoDB。
事实上也确实如此
我没有做过实验对比。需要update的表,一般都需要事务支持,那只能用InnoDB。
3、增删查改
对于增,即Insert,InnoDB速度快一些。
对于删,即Delete,两者相差不大。
有个例外,对于delete from user_info; 这种整表删除,
MyISAM是表文件后再重新创建,而InnoDB是一行一行删除记录。
O(1) 与 O(n)的区别。
对于查,即select,MyISAM要快很多,这是MyISAM的杀手锏。
传统的web应用,都是写少读多,那么正式MyISAM的用武之地。
再举一个O(1) 对 O(n)的例子:
由于MyISAM中存储表的行数
因此 select count(*) from user_info; 这种命令执行很快
而InnoDB查询统计表中记录条数。
对于改,即Update,InnoDB速度更快,支持事务和行级锁。
因此,MyISAM完败
4、锁
MyISAM只支持表锁,不支持行锁
因此,在并发更新时,效率比InnoDB低很多
当然,并不是每次更新的效率都低很多
在InnoDB中,对于 update user_info set age = 26 where user_name like '%tom%';
这种无法确定更新范围的语句,依然要锁整个表
5、auto_increment
在InnoDB中,如果一个字段被设置为auto_increment
那么这个表必须有一个索引,这个索引只包含这一个字段
这虽然是一个限制条件,但是一般很少遇到
因为大部分情况下,设为auto_increment的字段都是唯一主键
另外,MyISAM的auto_increment的效率要比InnoDB高 (10%左右)
遇到过很多次,insert时数据库报错说重复主键
之间一家公司,自己写了个服务替代MySQL的auto_increment
也有用UUID最为主键的,这样最简单,不过检索效率低些。
因此,MyISAM能高10%,也是一个不错的优势
6、总结
对于需要事务处理的表,乖乖使用InnoDB吧。
对于需要并发更新的表,还是乖乖使用InnoDB吧。
对于另外的情况,
如果是写多读少的表,那么还是使用InnoDB吧。
如果是写少读多的表,尽量使用MyISAM,这正是MyISAM被设计出来的目的。