InnoDB 和 MylSAM 主要有什么区别?

注:MySQL 8.0 开始逐渐流行,除非涉及面试,否则对 MyISAM 的了解可以不深入。

InnoDB 和 MyISAM 在以下几个方面有主要区别:

  1. 存储结构:每个 MyISAM 表在磁盘上存储为三个文件;而 InnoDB 的所有表都保存在同一个数据文件中(也可以是多个文件或独立的表空间文件)。InnoDB 表的大小仅受操作系统文件大小的限制,通常为 2GB。
  1. 事务支持:MyISAM 不提供事务支持;而 InnoDB 提供完整的事务支持,包括事务的提交、回滚和崩溃恢复能力。
  2. 最小锁粒度:MyISAM 只支持表级锁,更新时会锁定整张表,导致其他查询和更新操作被阻塞;而 InnoDB 支持行级锁,可以更细粒度地控制并发访问。
  3. 索引类型:MyISAM 的索引为非聚簇索引,数据和索引分开存储,索引结构是 B 树;而 InnoDB 的索引为聚簇索引,数据按照主键的顺序存储,索引结构是 B+ 树。
  4. 主键必需:MyISAM 允许表没有任何索引或主键的存在;而 InnoDB 如果没有显式指定主键或非空唯一索引,将自动生成一个对用户不可见的 6 字节主键,并将其作为数据的一部分存储在主索引中,附加索引则存储对应主索引的值。
  5. 表的具体行数:MyISAM 保存了表的总行数,可以直接通过执行 SELECT COUNT(*) FROM table 获取;而 InnoDB 没有保存表的总行数,因此执行相同的查询会遍历整个表。但是,当使用带有 WHERE 条件的查询时,MyISAM 和 InnoDB 的处理方式相同。
  6. 外键支持:MyISAM 不支持外键约束;而 InnoDB 支持外键约束,可以定义和管理表之间的关系。

标签: java, Java面试题, MySQL, Java问题合集, MySQL面试题, Java编程, Java问题精选, Java常见问题