MyISAM引擎和 InnoDB引擎的区别

MySQL 5.5之前的默认存储引擎是MyISAM,MyISAM的性能还可以(支持全文索引,压缩,空间函数等)。但是MyISAM不支持事务和行级锁,而且最大的缺陷是崩溃后无法安全恢复。MySQL5.5之后默认的存储引擎为InnoDB(事务性数据引擎)。

MyISAM引擎和InnoDB引擎的对比

  • MyISAM只支持表级锁,而InnoDB不仅支持表级锁而且还支持行级锁,默认为行级锁。
  • MyISAM不支持事务,InnoDB支持事务,具有commit和rollback事务的能力。
  • MyISAM不支持外键,而InnoDB支持。

一般不建议在数据库层使用外键,可以通过应用层面来解决,但有可能引发数据一致性问题。是否使用外键需结合项目具体分析。

  • MyISAM不支持数据库异常崩溃后的安全恢复,但InnoDB支持。使用InnoDB引擎在数据库异常崩溃后,数据库重新启动的时候会保证恢复到崩溃前的状态,这个恢复的过程依赖于redo log(重做日志)。
  • MyISAM不支持MVCC,而InnoDB支持。(MyISAM连行级锁都不支持,所以更不可能支持MVCC了。MVCC可以看作一个行级锁的升级,可以有效减少加锁操作,提高性能)。

MyISAM 和 InnoDB 存储引擎使用的锁:

  • MyISAM 采用表级锁(table-level locking)。
  • InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁
    表级锁和行级锁对比:
  • 表级锁: MySQL 中锁定 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM 和 InnoDB 引擎都支持表级锁。
  • 行级锁: MySQL 中锁定 粒度最小 的一种锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。

InnoDB 存储引擎的锁的算法有三种:

  • Record lock:记录锁,单个行记录上的锁
  • Gap lock:间隙锁,锁定一个范围,不包括记录本身
  • Next-key lock:record+gap 临键锁,锁定一个范围,包含记录本身