mysql存储引擎 InnoDB 与 MyISAM 的区别

1. 前言


  • 嘿嘿,懒癌晚期的我又更新了,这次算是对数据库索引这块做一些总结吧。
  • 俗话说好记性不如烂笔头,我这小小的脑袋实在不能对这些东西进行持久化(笑哭)。
  • 所以这里对存储引擎区别只是方便记忆使用,深入知识还请移步其他博客。
  • 希望我这些不是很死板的博客形式,能让大家在知识的获取的道路上至于太过乏味~
  • 好啦~废话少说,直接进入正题。
    mysql存储引擎 InnoDB 与 MyISAM 的区别_第1张图片

2. InnoDB 与 MyISAM

1. 锁支持

 MyISAM 只有表级锁(table-level locking),
 InnoDB 不仅支持表锁,同时还支持,
 ps:不懂表锁、行锁的兄弟姐妹建议先去了解一下。

2. 事务支持

MyISAM 是不支持事务滴,
InnoDB 提供事务支持,具有提交(commit)和回滚(rollback)事务的能力。

3. 外键支持

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

ps:实际业务中一般不在数据库使用外键,而是在应用层解决,数据库老老实实做数据存储就好啦~
reason:使用外键会造成级联更新,且级联更新是强阻塞,存在数据库更新风暴的风险。
reason:外键用时也会影响数据库的插入速度。
ps:对一个包含外键的InnoDB表转为MYISAM会失败!

4. 主键支持

MyISAM 允许没有主键的存在,注意是允许没有主键,不是完全没有主键的概念哈,
InnoDB 表必须有主键,如果没有设定主键,就会自动生成一个 6 字节隐藏列作为主键列(用户不可见)。

ps:至于为什么InnoDB 对主键这么执着其实和存储有关,不知道的小伙伴们可以自行百度~

5. 数据库崩溃的恢复支持

MyISAM 不支持崩溃恢复,
InnoDB 支持。

ps:使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。
ps:这个恢复的过程依赖于 redo log、undo log、bin log(日志很重要哦~不知道的小伙伴建议去了解一下)。

6. MVCC的支持

MyISAM 不支持,
InnoDB 支持。

ps:什么?你不知道什么是MVCC?
ps:MVCC机制也不是什么三言两语能说清楚的,不清楚的小伙伴建议去了解一下。
ps:MVCC 可以看作是行级锁的一个升级优化吧,可以有效减少加锁操作,提高性能。

7. 全文索引的支持

MyISAM 支持全文索引,
Innodb 从1.2.x 开始才增加了全文索引支持

也就是 MySQL 5.6开始,5.5及其之前是不支持的。
所以网上才会有人说 Innodb 不支持全文索引,又有人说 Innodb 支持全文索引的奇怪现象,咱不信谣不传谣~


ps:全文索引是只能在文本类型 CHAR,VARCHAR,TEXT 类型字段上创建的全文索引。
ps:字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。

8. 表具体行数记录的支持

MyISAM 支持
InnoDB 不支持

ps:啥?你问我这玩意有啥用?

在这里插入图片描述

ps:没用他加这个干吗, 
ps:InnoDB 不保存表的具体行数,执行select count(*) from table时需要全表扫描。
ps:MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快,
    但前提是没有任何WHERE条件,如果有条件,则此时都会去实际地去计算表的行数。

9. 聚集结构の区别

 MyISAM 是非聚集索引,数据文件是分离的,
 InnoDB 是聚集索引,数据文件是和索引绑在一起的。

10. 主键自增最大值的记录方式の区别

MyISAM 表会把自增主键的最大ID记录到表数据文件里,重启MySQL 自增主键的最大ID也不会丢失。
InnoDB 表只是把自增主键的最大 ID 记录到内存中,所以重启数据库会导致最大 ID 丢失,会以表中实际存在的最大主键为准。

11. 默认存储引擎之争

在 MySQL 5.1 及之前的版本中,MyISAM 是默认的存储引擎,
在 MySQL 5.5 版本以后,默认使用 InnoDB 存储引擎。

3. 最后

  • 以上就是mysql存储引擎 InnoDB 与 MyISAM 的区别总结,也许还有一些遗漏的,欢迎各路大哥在评论区补充~
  • 保持学习,热爱生活,天天开心,大家都要更好呀~
  • 风景图献上~
    mysql存储引擎 InnoDB 与 MyISAM 的区别_第2张图片

你可能感兴趣的:(mysql,mysql,数据库,sql)