MySQL存储引擎MyISAM和InnoDB的区别
地址:MySQL存储引擎MyISAM和InnoDB的区别 - 知乎 (zhihu.com)
你都工作3年了,怎么还不知道MyISAM和InnoDB有什么区别?一位粉丝被面试官这样一个问题。当时,这位粉丝直接回复“不知道”,这位粉丝自己也怪不好意思的。
其实,面试官问他这个问题也不是随便问的,也是看了这位粉丝简历上写了熟练MySQL才提问的。其实,对于MySQL,这位粉丝可能只是非常熟练地完成建库、建表、往数据库表中读写数据这些简单的操作而已,并没有去了解建表的原理。
这个面试题也给我们敲了一下警钟,对于有些技术的知识点,要是没有掌握到一定深度,建议不要写熟练之类的,如果真要写,建议用了解或者熟悉这样的字眼来描述,避免面试官问起时又答不出来,暴露了自己的不足。
另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以在我的煮叶简介中找到。
MyISAM和InnoDB到底有什么区别呢?
1、MyISAM和InnoDB的区别
MySQL 5.5以后的版本开始将InnoDB作为默认的存储引擎,之前的版本都是MyISAM。关于MyISAM和InnoDB的区别,我总结为以下5个方面,希望能帮助到大家。
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版本对两者的支持都有所改进
2、总结及建议
最后总结一下,MyISAM和InnoDB的主要区别包括
1). 数据的存储结构不同
2). 存储空间的消耗不同
3). 对事务的支持不同
4). 对锁的支持不同
5). 对外键的支持不同
MyISAM和InnoDB的区别还有很多,我这里只是列举了比较重要的几点。那我们在实际开发中,该如何选择MyISAM和InnoDB呢?我总结为以下三点:
1、如果需要支持事务,选择InnoDB,不需要事务则选择MyISAM。
2、如果大部分表操作都是查询,选择MyISAM,有写又有读选InnoDB。
3、如果系统崩溃导致数据难以恢复,且成本高,不要选择MyISAM。
评论区