MySQL引擎——InnoDB和MyISAM的区别

前言

MySQL 是一个支持多引擎的系统, 主要有以下几种:

  • MyIsam
  • InnoDB
  • Memory
  • Blackhole
  • CSV
  • Performance_Schema
  • Archive
  • Federated
  • Mrg_Myisam

而在实际应用中,比较常用的就是InnoDB和MyISAM这两种,但是大多数人都不太清楚两者的区别,为什么MyISAM会被InnoDB取代?这篇文章就重点讨论它们的区别。

crash-safe

crash-safe 简单来说,就是即使数据库发生异常重启,之前提交的记录也不会丢失。

InnoDB引擎是具备这个能力的,而MyISAM是不具备的。InnoDB之所以具备这个能力,是因为它特有的日志——redo log,关于redo log的具体内容可以查看MySQL两大日志模块——redo log(重做日志)和 binlog(归档日志)。

事务

事务就是要保证一组数据库操作,要么全部成功,要么全部失败。更多关于事务的内容可以查看事务的特性和隔离级别。

在 MySQL 中,事务支持是在引擎层实现的。你现在知道,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务,MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。

另外一点,当我在给MySQL数据库做逻辑备份时,官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图,single-transaction 方法只适用于所有的表使用事务引擎的库。如果有的表使用了不支持事务的引擎,那么备份就只能通过 FTWRL(Flush tables with read lock) 方法,使整个库处于只读状态。

行锁

MyISAM 引擎不支持行锁。不支持行锁意味着并发控制只能使用表锁,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB 是支持行锁的,这也是 MyISAM 被 InnoDB 替代的重要原因之一。

总结

  1. InnoDB具有crash-safe能力,而MyISAM没有;
  2. InnoDB支持事务,而MyISAM不支持;

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