InnoDB

是 MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎

实现了四个标准的隔离级别,默认级别为可重复读。在可重复读的级别下,通过多版本并发控制(MVCC)+间隙锁(Next-Key Locking)防止幻读。

基于聚簇索引(主索引)建立,在主索引中保存数据。与其他存储引擎有很大的区别,聚簇索引对主键查询有很高的性能,不过它的二级索引(非主键索引)必须包含主键列。所以如果主键列很大的话,索引会很大。

MyISAM

在5.1之前,MyISAM 是默认的引擎,MyISAM 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用它。

提供了大量的特性,包括压缩表、空间数据索引等。

但是 MyISAM 不支持事务和行级锁,而且在崩溃后无法安全恢复。即使后续版本中 MyISAM 支持了事务,但是很多人的概念中依然是不支持事务的引擎。

不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取操作的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。

比较

事务和外键

InnoDB 是事务型的,可以使用 Commit 和 Rollback 语句。

InnoDB 支持外键。

锁和并发

MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。

MyISAM 读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM 还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。

InnoDB 读写阻塞与事务隔离级别相关。

索引和存储

MyISAM 和 InnoDB 的索引都采用了 B+ 树的结构。

MyISAM 的索引和数据是分开的,是非聚簇索引。叶子节点存放索引键和数据记录的地址,如下图所示:

MyISAM 引擎将数据存储成三个文件,以表名命名,扩展名指出文件类型。

  • .frm 文件存储表定义。
  • .MYD 文件存储数据。
  • .MYI 文件存储索引。

而 InnoDB 引擎的数据存储在聚簇索引(主键建立的索引)的叶子节点中,如下图所示:

InnoDB 的非聚簇索引的叶子节点存储了该条记录的主键。如下图所示:

因此使用非聚簇索引查询数据时,还需要利用聚簇索引再查询一遍(回表查询)。但是有一种情况例外:你要查询的信息包含在索引内(覆盖索引)。

注意:MyISAM 表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦

其他

  • MyISAM 引擎保存了表中数据的行数,查询时可以直接读取。InnoDB 引擎需要扫描一遍表来计算行数。但是如果查询语句中包含了 where 条件时,两种引擎的操作是一样的。
  • DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行的删除。
  • 如果执行大量的 SELECT,MyISAM 是更好的选择,如果你的数据执行大量的 INSERTUPDATE,出于性能方面的考虑,应该使用 InnoDB 表。

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

载入天数...载入时分秒... 本站使用 Volantis 作为主题 鲁ICP备-20012065号