MySQL 知识-- InnoDB 和 MyISAM

本文最后更新于:10 天前

区别

  1. InnoDB 支持事务,MyISAM 不支持事务

  2. InnoDB 是聚簇索引,MyISAM 是非聚簇索引

    InnoDB 是聚簇索引,聚簇索引文件放在主键索引的叶子节点上,但是辅助索引需要两次查询:先查到主键,然后根据主键回表查到数据

    对于 InnoDB 的聚集索引,就是表本身

    InnoDB 的聚集索引中,有主键列,事务 id,回滚指针,非主键列

    MyISAM 是非聚簇索引,数据文件是分离的,索引保留的是数据文件的指针,主键索引和辅助索引是独立的

  3. InnoDB 支持外键,MyISAM 不支持外键

  4. InnoDB 不保存表的行数,MyISAM 保留了表的行数

    所以 InnoDB 在 count(*) 会进行全表扫描

  5. InnoDB 锁的最小粒度是行锁,MyISAM 最小粒度是表锁

    MyISAM 在更新一行数据时会锁住整个表,限制并发量,这是 MySQL 5.2 将默认的 MyISAM 换成 InnoDB 的主要原因

    不过 InnoDB 的行锁是实现在索引上的,所以如果没有命中索引行锁会退化成表锁

  6. InnoDB 可以在崩溃后安全恢复,MyISAM 不行

  7. InnoDB 键值一起保存,索引与数据一起载入InnoDB缓冲池;MyISAM键值分离,索引载入内存(key_buffer_size),数据缓存依赖操作系统

相同

索引都是 B+ 树结构

如何选择

  1. MyISAM 管理非事务表,提供高速存储和检索以及全文搜索能力,如果表数据一般改变不大,只是执行大量读操作或者不需要事务管理,应该选择 MyISAM

  2. 没有特殊要求就选择 InnoDB