MyISAM和InnoDB表引擎的区别

掘金日新计划 · 6 月更文挑战」的第7天

存储引擎

  • 存储引擎以前叫做 表处理器 ,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。
  • 为了管理方便,人们把 连接管理 、 查询缓存 、 语法解析 、 查询优化 这些并不涉及真实数据存储的功能划分为MySQL server 的功能,把真实存取数据的功能划分为 存储引擎 的功能。各种不同的存储引擎向上边的 MySQLserver 层提供统一的调用接口(也就是存储引擎 API ),包含了几十个底层函数,像 " 读取索引第一条内容 " 、 " 读取索引下一条内容 " 、 " 插入记录 " 等等。

所以在 MySQL server 完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的 API ,获取到数据后返回给客户端就好了。

MySQL 服务器把数据的存储和提取操作都封装到了一个叫 存储引擎 的模块里。我们知道 表 是由一行一行的记录 组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存 储器上,这都是 存储引擎 负责的事情。为了实现不同的功能, MySQL 提供了各式各样的 存储引擎 ,不同 存储引擎 管理的表具体的存储结构可能不同,采用的存取算法也可能不同。

MyISAM和InnoDB表引擎的区别

1655866445897.png

1,事务支持

MyISAM 不支持事务,而 InnoDB 支持。

2,存储结构

  • MyISAM :每个 MyISAM 在磁盘上存储成三个文件。
  • frm 文件存储表结构。
  • MYD 文件存储数据。
  • .MYI 文件存储索引。
  • InnoDB :主要分为两种文件进行存储
  • frm 存储表结构
  • ibd 存储数据和索引 (也可能是多个 .ibd 文件,或者是独立的表空间文件)

3,表锁差异

  • MyISAM :只支持表级锁 ,用户在操作 myisam 表时, select , update , delete , insert 语句都会给表自动加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插入新的数据。
  • InnoDB :支持事务和行级锁,是innodb 的最大特色 。行锁大幅度提高了多用户并发操作的新能。但是 InnoDB 的行锁,只是在 WHERE 的主键是有效的,非主键的 WHERE 都会锁全表的。

4,表主键

  • MyISAM :允许没有任何索引和主键的表存在,索引都是保存行的地址。
  • InnoDB :如果没有设定主键或者非空唯一索引,就会自动生成一个 6 字节的主键 ( 用户不可见 ) ,数据是主索引的一部分,附加索引保存的是主索引的值。 InnoDB 的主键范围更大,最大是 MyISAM 的 2 倍。

5,表的具体行数

  • MyISAM :保存有表的总行数,如果 select count() from table; 会直接取出出该值。
  • InnoDB :没有保存表的总行数( 只能遍历 ) ,如果使用 select count() from table ;就会遍历整个表,消耗相当大,但是在加了 wehre 条件后, myisam 和 innodb 处理的方式都一样。

6,CURD 操作

  • MyISAM :如果执行大量的 SELECT , MyISAM 是更好的选择。
  • InnoDB :如果你的数据执行大量的 INSERT 或UPDATE ,出于性能方面的考虑,应该使用 InnoDB 表。 DELETE 从性能上 InnoDB 更优,但 DELETE FROM table 时, InnoDB 不会重新建立表,而是一行一行的删除,在 innodb 上如果要清空保存有大量数据的表,最好使用 truncate table 这个命令。

7,外键

  • MyISAM :不支持
  • InnoDB :支持

8,查询效率

MyISAM 相对简单,所以在效率上要优于 InnoDB ,小型应用可以考虑使用 MyISAM 。 推荐考虑使用 InnoDB 来替代 MyISAM 引擎,原因是 InnoDB 自身很多良好的特点,比如事务支持、存储 过程、视 图、行级锁定等等,在并发很多的情况下,相信 InnoDB 的表现肯定要比 MyISAM 强很多。 另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥 MySQL 的性能优 势。如果不是很复杂的 Web 应用,非关键应用,还是可以继续考虑 MyISAM 的,这个具体情况可以自己斟酌。

9,MyISAM 和 InnoDB 两者的应用场景:

  • MyISAM 管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的 SELECT 查询,那么 MyISAM 是更好的选择。
  • InnoDB 用于事务处理应用程序,具有众多特性,包括 ACID 事务支持。如果应用中需要 执行大量的 INSERT 或 UPDATE 操作,则应该使用 InnoDB ,这样可以提高多用户并发操作的性能。现在默认使用 InnoDB

猜你喜欢

转载自juejin.im/post/7111892881115201572