一文彻底搞懂MyISAM和InnoDB区别

本文对比了MySQL5.5之前的MyISAM和InnoDB存储引擎,主要关注行级锁、事务支持、外键、数据恢复、MVCC和索引实现。InnoDB凭借事务、行级锁和安全恢复成为默认选择,而MyISAM虽有压缩功能但存在明显不足。
摘要由CSDN通过智能技术生成


MySQL 5.5版本之前,MyISAM引擎是MySQL的默认存储引擎,拥有全文索引、压缩和空间函数等特性,但其不支持事务和行级锁定,最致命的缺陷是崩溃后无法安全恢复数据。然而,自MySQL 5.5版本起,InnoDB成为MySQL的默认存储引擎,其强大的事务支持、行级锁定以及崩溃恢复功能成为用户的首选。

1. 是否支持行级锁

  • MyISAM引擎只支持表级锁(table-level locking)。
  • InnoDB引擎支持行级锁(row-level locking)和表级锁,而且默认使用行级锁。

MyISAM在进行锁定时会锁住整张表,而InnoDB在并发写入时能够更加灵活地控制锁定,因此性能更为优越。

2. 是否支持事务

  • MyISAM 不提供事务支持。
  • InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别,具有提交(commit)和回滚(rollback)事务的能力。并且,InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)

3. 是否支持外键

  • MyISAM 不支持。
  • InnoDB 支持。

外键对于维护数据一致性非常有帮助,但是对性能有一定的损耗。因此,通常情况下,我们是不建议在实际生产项目中使用外键的,在业务代码中进行约束即可!

阿里的《Java 开发手册》也是明确规定禁止使用外键的。
在这里插入图片描述
总结:一般我们也不建议在数据库层面使用外键的,应用层面可以解决。不过,这样会对数据的一致性造成威胁。具体要不要使用外键还是要根据你的项目来决定。

4. 是否支持数据库异常崩溃后的安全恢复

  • MyISAM 不支持。
  • InnoDB 支持。

使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 redo log 。

5. 是否支持 MVCC

  • MyISAM 不支持。
  • InnoDB 支持。

MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提高性能。

6. 索引实现

  • 虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
  • InnoDB 引擎中,其数据文件本身就是索引文件。
  • MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。

7. 常见的几种 MySQL 存储引擎对比

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值