MySQL 知识-- InnoDB 和 MyISAM
本文最后更新于:10 天前
⚡区别
-
InnoDB 支持事务,MyISAM 不支持事务
-
InnoDB 是聚簇索引,MyISAM 是非聚簇索引
InnoDB 是聚簇索引,聚簇索引文件放在主键索引的叶子节点上,但是辅助索引需要两次查询:先查到主键,然后根据主键回表查到数据
对于 InnoDB 的聚集索引,就是表本身
InnoDB 的聚集索引中,有主键列,事务 id,回滚指针,非主键列
MyISAM 是非聚簇索引,数据文件是分离的,索引保留的是数据文件的指针,主键索引和辅助索引是独立的
-
InnoDB 支持外键,MyISAM 不支持外键
-
InnoDB 不保存表的行数,MyISAM 保留了表的行数
所以 InnoDB 在
count(*)
会进行全表扫描 -
InnoDB 锁的最小粒度是行锁,MyISAM 最小粒度是表锁
MyISAM 在更新一行数据时会锁住整个表,限制并发量,这是 MySQL 5.2 将默认的 MyISAM 换成 InnoDB 的主要原因
不过 InnoDB 的行锁是实现在索引上的,所以如果没有命中索引行锁会退化成表锁
-
InnoDB 可以在崩溃后安全恢复,MyISAM 不行
-
InnoDB 键值一起保存,索引与数据一起载入InnoDB缓冲池;MyISAM键值分离,索引载入内存(key_buffer_size),数据缓存依赖操作系统
⚡相同
索引都是 B+ 树结构
⚡如何选择
-
MyISAM 管理非事务表,提供高速存储和检索以及全文搜索能力,如果表数据一般改变不大,只是执行大量读操作或者不需要事务管理,应该选择 MyISAM
-
没有特殊要求就选择 InnoDB
本博客所有文章除特别声明外,均采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 。转载请注明出处!