MyISAM与InnoDB表引擎的区别
首先,MyISAM和InnoDB都是属于MySQL的其中两种存储引擎,而这两种也是用得相对来多一些,那么下面就来介绍一下这两种表引擎的区别。
1、事务支持
MyISAM不支持事务,而InnoDB支持事务。
事务:访问并更新数据库中数据的执行单元。 事务操作中,要么都执行要么都不执行。
2、存储结构
MyISAM:每个MyISAM在磁盘上存储成三个文件。
- .frm文件存储表结构
- .MYD文件存储数据
- .MYI文件存储索引
InnoDB:主要分为两种文件进行存储
- .frm存储表结构
- .ibd存储数据和索引(也可能是多个.ibd文件,或者是独立的表空间文件)
3、表锁差异
MyISAM:
- 只支持表级锁。用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:
- 支持事务和行级锁,是Innodb的最大特色。
- 行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。
4、表主键
MyISAM:
- 允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:
- 如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
- InnoDB的主键范围更大,最大是MyISAM的2。
5、表的具体行数
MyISAM:
- 保存有表的总行数,如果
select count() from table;
会直接取出该值。
InnoDB:
- 没有保存表的总行数,只能遍历。如果
select count() from table;
就会遍历整个表,内存消耗很大,但是在加了where
条件后,MyISAM和InnoDB处理的方式都一样。
6、CURD(增删改查)操作
MyISAM:
- 如果执行大量的
select
,MyISAM是更好的选择。
InnoDB:
- 如果你的数据执行大量的
insert
或update
,出于性能方面的考虑,应该使用InnoDB表。delete
从性能上来说InnoDB更优,但delete from table
时,InnoDB不会重新建立表,而是一行一行的删除,在InnoDB上如果要清空保存有大量数据的表,可以使用truncate table
这个命令。
7、外键
MyISAM:不支持
InnoDB:支持
8、查询效率
- MyISAM相对简单,所以在效率上要由于InnoDB,小型应用可以考虑使用MyISAM。
9、应用场景
MyISAM:
- 管理非事务表。提供高速存储和检索,以及全文搜索能力。
- 如果应用中需要执行大量的select查询,那么MyISAM是更好的选择。
InnoDB:
- InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,InnoDB的表现肯定要比MyISAM强很多。
- 如果应用中需要执行大量的insert或update操作,则应该使用InnoDB,这样可提高多用户并发操作的性能。
还有就是,任何一种表都不是万能的,只有恰当的针对业务类型来选择合适的表类型,才能最大发挥MySQL的性能优势。现在默认使用InnoDB。