侧边栏壁纸
博主头像
孤星博主等级

行动起来,活在当下

  • 累计撰写 15 篇文章
  • 累计创建 10 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

MySQL存储引擎

孤星
2023-09-09 / 0 评论 / 0 点赞 / 58 阅读 / 7393 字

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). 数据的存储结构不同

mysql_MyISAM_InnoDB1_669bc1f9785b1.jpeg

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

mysql_MyISAM_InnoDB2_669bc1fd3d0f9.jpeg

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

mysql_MyISAM_InnoDB3_669bc2002e8a6.jpeg

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

mysql_MyISAM_InnoDB4_669bc2035de31.jpeg

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

mysql_MyISAM_InnoDB5_669bc20607d50.jpeg

2). 存储空间的消耗不同

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

mysql_MyISAM_InnoDB6_669bc208c109d.jpeg

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

mysql_MyISAM_InnoDB7_669bc20b33eb6.jpeg

3). 对事务的支持不同

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

mysql_MyISAM_InnoDB8_669bc20db75c8.jpeg

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

mysql_MyISAM_InnoDB9_669bc2101ca14.jpeg

4). 对锁的支持不同

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

mysql_MyISAM_InnoDB10_669bc212bbeed.jpeg

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

mysql_MyISAM_InnoDB11_669bc2156cef7.jpeg

5). 对外键的支持不同

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

mysql_MyISAM_InnoDB12_669bc218698ef.jpeg

2、总结及建议

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

mysql_MyISAM_InnoDB13_669bc21b0f182.jpeg

1). 数据的存储结构不同

2). 存储空间的消耗不同

3). 对事务的支持不同

4). 对锁的支持不同

5). 对外键的支持不同

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

mysql_MyISAM_InnoDB14_669bc21d9bd5a.jpeg

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

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

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

0

评论区