MySQL存储引擎MyISAM和InnoDB的区别

发布时间 2023-03-29 14:49:30作者: 晨光浅夏

 

MyISAM

MyISAM 是 MySQL 5.5 版本之前的默认引擎,支持全文检索、压缩、空间函数等,但是不支持事务和行级锁,所以一般用于有大量查询少量插入的场景来使用。而且 MyISAM 不支持外键,索引和数据是分开存储的。

InnoDB

InnoDB 是 MySQL 5.5 版本之后的默认引擎,基于聚簇索引建立的,支持事务、外键、行级锁,并且通过 MVCC 来支持高并发,索引和数据存储在一起。

如何选择

1、如果需要事务,选择 InnoDB,不需要则选择 MyISAM。

2、如果大部分表操作都是查询,选择 MyISAM,有写又有读选 InnoDB。

3、如果系统崩溃导致数据难以恢复,且成本高,不要选择 MyISAM。

一、MyISAM和InnoDB的区别

MySQL 5.5以后的版本开始将InnoDB作为默认的存储引擎,之前的版本都是MyISAM。关于MyISAM和InnoDB的区别。

1)数据的存储结构不同

先来看MyISAM,每个MyISAM在磁盘上存储成三个文件,它们以表的名字开头来命名。.frm文件存储表定义。.MYD(MYD)存储数据文件。.MYI(MYIndex)存储索引文件。

 而 InnoDB在磁盘上保存为两个文件。.frm文件同样存储为表结构文件,.ibd文件存储的是数据和索引文件。

 由于MyISAM的索引和数据是分开存储的,因此索引查找的时候,MyISAM的叶子节点存储的是数据所在的地址,而不是数据。

 而InnoDB叶子节点存储的是整个数据行所有的数据。

 2)存储空间的消耗不同

MyISAM可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。

 InnoDB需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。InnoDB所在的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

 3)对事务的支持不同

MyISAM强调的是性能,每次查询具有原子性,其执行速度比Innodb类型更快,但是不提供事务支持。

 InnoDB除了提供事务支持和外部键等高级数据库功能。还具有事务提交(commit)、回滚(rollback)和崩溃修复能力(crach recovery capabilities)等这些事务安全(transaction-safe ACID compliant)型表。

4)对锁的支持不同

如果只是执行大量的查询, MyISAM是更好的选择。MyISAM在增删的时候需要锁定整个表格,效率会低一些。

而InnoDB支持行级锁,删除插入的时候只需要锁定操作行就行。如果有大量的插入、修改删除操作,使用InnoDB性能能会更高。

5)对外键的支持不同

MyISAM不支持外键,而InoDB支持外键。当然,各种不同MySQL版本对两者的支持都有所改进

二、总结及建议

最后总结一下,MyISAM和InnoDB的主要区别包括

1)数据的存储结构不同

2)存储空间的消耗不同

3)对事务的支持不同

4)对锁的支持不同

5)对外键的支持不同

MyISAM和InnoDB的区别还有很多,我这里只是列举了比较重要的几点。那我们在实际开发中,该如何选择MyISAM和InnoDB呢?我总结为以下三点:

1、如果需要支持事务,选择InnoDB,不需要事务则选择MyISAM。

2、如果大部分表操作都是查询,选择MyISAM,有写又有读选InnoDB。

3、如果系统崩溃导致数据难以恢复,且成本高,不要选择MyISAM。

以上就是我对MyISAM和InnoDB区别的总结和理解,下次面试你会了吗?

 

本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。 关注微信公众号『 Tom弹架构 』回复“666”可获取200页的PDF面试文档!