目录

  • 前言
    • 存储引擎
  • 区别
    • 事务
    • 外键
    • 表单的存储
    • 数据查询效率
    • 数据更新效率
  • 如何选择

前言

MyISAM和InnoDB是使用MySQL最常用的两种存储引擎,在5.5版本之前默认采用MyISAM存储引擎,从5.5开始采用InnoDB存储引擎。

存储引擎

存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。

MySQL的核心就是插件式存储引擎,支持多种存储引擎

show engines; //查看存储引擎

关于数据库的大致架构和基础操作,参考本人博客,这里不过多介绍;

区别

说区别之前说一下他俩的索引底层都是BTREE+ , B+树的数据结构维护索引和数据(m是非聚簇索引,i是聚簇索引,这点注意下)参考本人博客

事务

  • InnoDB支持事务,具有安全性和完整性,系统容灾性强,且通过使用多版本并发控制MVCC来获得高并发性; 参考本人博客
  • MyISAM不支持事务; 系统容灾性弱;

外键

  • InnoDB支持外键
  • MyISAM不支持外键

因此把一个有外键的InnoDB表单转换成MyISAM表单会失败;

表单的存储

通过使用不同存储引擎建立表单查看生成的对应存储文件,发现除了双方共有的 .frm存储表属性外:

  • InnoDB存储引擎表单独存放到一个独立的IBD文件中;(索引和数据放在了一起)–>聚簇索引–>通过主键索引效率高; 普通键进行索引可能需要回表;

  • MyISAM存储引擎表单MYDMYI两部分组成,其中MYD(MYData)用来存放数据文件,而MYI(MYIndex)则用来存放索引文件–>非聚簇索引–>数据存放的是指针,不需要回表,主键索引和普通键索引分开了;

数据查询效率

  • InnoDB不支持全文索引,而 MyISAM 支持全文索引查询效率上 MyISAM更高;
  • InnoDB不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而 MyISAM 用一个变量保存了整个表的行数,执行上述语句时
    只需要读出该变量即可,速度很快;

数据更新效率

InnoDB的内部优化,包括**磁盘预读(**从磁盘读取数据时采用可预测性读取),自适应哈希(自动在内存中创建hash索引以加速读操作)等, 且能够加速插入操作的插入缓冲区。所以比MyISAM在数据更新能力上更优;

如何选择

  1. 看设计的业务是否需要支持事务,需要–InnoDB;不需要–MyISAM;
  2. 如果select读操作频繁,用MyISAM; 如果数据更新操作使用频繁操作用InnoDB
  3. 考虑系统容灾能力,MyISAM更不容易恢复,InnoDB容易恢复;

既然MySQL5.5版本之后默认了InnoDB,不知道用什么那就InnoDB,跟着主流走不会错;