MySQL中InnoDB和MyISAM引擎的区别

285 阅读2分钟

MySQLInnoDBMyISAM引擎的区别

InnoDB 支持事务,MyISAM 不支持事务。

InnoDB 支持外键,而 MyISAM 不支持。

表的行数

InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数。

表锁差异

InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。用户在操作MyISAM表时,selectupdatedeleteinsert语句都会给表自动加锁。

可移植性、备份及恢复的差别

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

CRUD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。

InnoDB:如果你的数据执行大量的INSERTUPDATE,出于性能方面的考虑,应该使用InnoDB表。

索引差异

InnoDB 是聚集索引,MyISAM 是非聚集索引。

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

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

InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。

欢迎大家访问我的个人小站www.chenmx.net