MySQL存储引擎
InnoDB和MyISAM的区别
(1)InnoDB和MyISAM都是Mysql的存储引擎,现在MyISAM也逐渐被InnoDB给替代,主要因为InnoDB支持事务和行级锁,MyISAM不支持事务和行级锁,MyISAM最小锁单位是表级。因为MyISAM不支持行级锁,所以在并发处理能力上InnoDB会比MyISAM好。
(2) 数据的存储上:MyISAM的索引也是由B+树构成,但是树的叶子结点存的是行数据的地址,查找时需要找到叶子结点的地址,再根据叶子结点地址查找数据。

InnoDB的主键索引的叶子结点直接就是存储行数据,查找主键索引树就能获得数据:

若是根据非主键索引查找,非主键索引的叶子结点存储的就是,当前索引值以及对应的主键的值,若是联合索引存储的就是联合索引值和对应的主键值。

(3)数据文件构成:MyISAM有三种存储文件分别是扩展名为:.frm(文件存储表定义)、.MYD (MYData数据文件)、.MYI (MYIndex索引文件)。而InnoDB的表只受限于操作系统文件的大小,一般是2GB
(4)查询区别:对于读多写少的业务场景,MyISAM会更加适合,而对于update和insert比较多的场景InnoDB会比较适合。
(5)count(*)区别:select count(*) from table,MyISAM引擎会查询已经保存好的行数,这是不加where的条件下,而InnoDB需要全表扫描一遍,InnoDB并没有保存表的具体行数。
(6)其它的区别:InnoDB支持外键,但是不支持全文索引,而MyISAM不支持外键,支持全文索引,InnoDB的主键的范围比MyISAM的大。
总结
| MyISAM | InnoDB | |
|---|---|---|
| 默认 | 不支持 | 支持 |
| 事务 | 不支持 | 支持 |
| 外键 | 不支持 | 支持 |
| 聚集索引 | 不支持 | 支持 |
| 索引和数据 | 分开存储 | 存储在一起 |
| MVCC | 不支持 | 支持 |
| 备份 | 不支持 | 在线热备 |
| 全文索引 | 支持 | 不支持 |
| 主键范围 | 小 | 大 |
| 并发能力 | 低 | 高(通过MVCC来支持) |
| 锁粒度 | 表锁 | 行锁、表锁、页锁 |
| 查询 | 读多写少 | 更新和插入较多的场景 |
| 行数 | 保存 | 不保存 |
| 崩溃恢复 | 慢,易丢失 | 概率低 |
| 数据文件 | .frm(文件存储表定义).MYD (MYData数据文件).MYI (MYIndex索引文件) | .frm.ibd只受限于操作系统文件的大小 一般是2GB |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Michael's Blog!
评论




