一、概念

167f4c7b99f87e1c.png

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

image.png

二、MyISAM 和 InnoDB 表引擎的区别

1) 事务支持

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

事务:访问并更新数据库中数据的执行单元。事物操作中,要么都执行要么都不执行

2) 存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。

  • .frm文件存储表结构。
  • .MYD文件存储数据。
  • .MYI文件存储索引。

InnoDB:主要分为两种文件进行存储

  • .frm 存储表结构
  • .ibd 存储数据和索引 (也可能是多个.ibd文件,或者是独立的表空间文件)

3) 表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如
果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是 innodb 的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁是基于索引建立的,如果索引失效或没有使用索引,那么行锁会升级为表锁。

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 XXX; 这个命令。

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。