Mysql 中 MyISAM 和 InnoDB 的区别有哪些 你知道吗?

本文详细比较了MySQL中InnoDB与MyISAM两种存储引擎的特点与适用场景。包括事务支持、外键约束、索引类型、性能差异等方面,并提供了选择建议。

区别:
1.. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
2.. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

3.. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4..InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
5.. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;

如何选择:
1.. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
2.. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。
3.. 系统奔溃后,MyISAM恢复起来更困难,能否接受;
4.. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。

作者:Oscarwin
链接:https://www.zhihu.com/question/20596402/answer/211492971
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### MySQL MyISAM InnoDB 存储引擎的区别 #### 1. **事务支持** InnoDB 支持事务,而 MyISAM 不支持事务。这意味着在需要保证数据一致性完整性的场景下(如银行转账操作),InnoDB 是更好的选择[^3]。 #### 2. **外键约束** InnoDB 支持外键约束,这有助于维护表之间的参照完整性。相比之下,MyISAM 不支持外键,因此无法实现这种级别的数据一致性控制。 #### 3. **索引机制** - InnoDB 使用聚集索引(Clustered Index),数据存储在主键索引的叶子节点上。这种方式使得通过主键检索数据非常高效,但也意味着辅助索引需要两次查询才能获取数据。 - MyISAM 使用非聚集索引(Non-clustered Index),索引中保存的是指向数据文件的指针。由于数据文件索引文件是分开的,MyISAM 的主键索引辅助索引相互独立[^3]。 #### 4. **锁机制** - InnoDB 提供行级锁定(Row-level Locking),允许更高的并发性能。即使在一个表中有大量更新操作,也不会影响其他用户的读取或写入请求。 - MyISAM 实现的是表级锁定(Table-level Locking)。当某个线程对表进行写操作时,整个表会被锁定,阻止其他线程对该表的任何修改或查询操作。 #### 5. **崩溃恢复能力** InnoDB 具备更强的崩溃恢复能力,因为它实现了事务日志记录功能,在系统发生异常中断后可以通过重做日志快速完成状态回滚或者前滚。然而,MyISAM 并不具备类似的自动修复特性,一旦遇到意外情况可能导致部分数据丢失或损坏[^3]。 #### 6. **计数统计** 执行 `SELECT COUNT(*) FROM table` 这类全量统计语句时: - InnoDB 需要扫描整张表来计算结果; - 而 MyISAM 则预先保留了一个全局变量用于跟踪总行数,所以这类查询的速度更快[^3]。 #### 7. **存储结构差异** 两者的数据存储方式存在显著差别——具体表现为物理磁盘布局上的设计思路各异[^2]。 --- ### 总结 综合来看,尽管 MyISAM 在某些特定场合下仍具有一定优势(比如只涉及简单 SELECT 查询且无需关注 ACID 属性的小型项目),但从长远发展角度出发以及考虑到现代应用程序普遍需求较高的可靠性灵活性方面考量,则推荐优先选用 InnoDB作为默认选项[^4]。 ```sql -- 创建使用 InnoDB 引擎的表示例 CREATE TABLE example_innodb ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL ) ENGINE=InnoDB; -- 创建使用 MyISAM 引擎的表示例 CREATE TABLE example_myisam ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL ) ENGINE=MYISAM; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值