Mysql 中 myisam 与 innodb 的区别

存储结构

MyISAM:每个 MyISAM 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指
出文件类型。.frm 文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI
(MYIndex)
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),
InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。

存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾
不能有空格,会被去掉)、动态表压缩表
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比 InnoDB 类型更快,但是不提供事务
支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)回滚(rollback)
崩溃修复能力(crash recovery capabilities)事务安全(transaction-safe (ACID compliant))型表。
 

SELECT、UPDATE、INSERT、Delete操作 
如果执行大量的SELECT,MyISAM是更好的选择。 
如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。 
DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。而MyISAM则是重新建立表。在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

AUTO_INCREMENT 
MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。 
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列

全文索引 

MyISAM:支持 FULLTEXT类型的全文索引。不支持中文。

InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

表锁差异 

MyISAM:只支持表级锁,只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁。 
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表, 例如update table set num=1 where name like “%aaa%”


一般来说: 
MyISAM适合: 

  1. 做很多count 的计算; 
  2. 插入不频繁,查询非常频繁; 
  3. 没有事务。

InnoDB适合:

  1. 可靠性要求比较高,或者要求事务; 
  2. 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。

两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。

 

posted @ 2020-04-27 09:30  Tracydzf  阅读(131)  评论(0编辑  收藏  举报