InnoDB存储引擎和MyISAM存储引擎有什么区别?
一、InnoDB和MyISAM介绍
- MySQL5.5.5版本之后,默认采用
InnoDB
存储引擎 。 InnoDB是MySQL的默认事务型引擎 ,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。 - MyISAM 是 MySQL5.5.5版本之前默认的存储引擎。但它不支持
事务
、行级锁
、外键
,有一个毫无疑问的缺陷就是崩溃后无法安全恢复 。优势是访问的速度快 ,对事务完整性没有要求或者以SELECT
为主的应用。
主要区别
对比项 | InnoDB | MyISAM |
---|---|---|
事务 | 支持 | 不支持 |
外键 | 支持 | 不支持 |
锁 | 行级锁 ,操作时只锁某一行,不对其它行有影响, 适合高并发的操作 | 表级锁 ,即使操作一条记录也会锁住 整个表,不适合高并发的操作 |
可恢复性 | 可以根据事务日志进行恢复 | 不可恢复 |
表结构 | 数据和索引集中存储。 ①数据和索引存放在 .ibd 文件中②表结构存放在 .frm 文件中③MySQL8.0后,表结构和数据、索引均存放在 .ibd 文件中 | 数据和索引是分开存储的。 ①数据存放在 .MYD 文件中,②索引存放在 .MYI 文件中③表结构存放在 .frm 文件中④MySQL8.0后,表结构更该存放在 .sdi 文件中 |
性能 | 执行大量的INSERT、DELETE、UPDATE,性能优于MyISAM | 执行大量的SELECT,性能优于InnoDB |
二、开发中,两者如何选择?
-
由于MySQL5.5.5版本后,默认的存储引擎就是
InnoDB
,所以在无特殊要求的情况下,默认使用InnoDB存储引擎即可。 -
如果在开发中,在面对高并发场景下,对事务要求特别严格,那么就必须选择InnoDB存储引擎。
-
如果在开发中,在只读应用或者在多读写少的业务场景下,对事务不做严格要求,可以选择MyISAM存储引擎,比如日志表。
三、常见面试题
1、InnoDB存储引擎和MyISAM存储引擎有什么区别?
答:
-
InnoDB存储引擎支持
事务
、外键
和行级锁
,MyISAM不支持,MyISAM只支持表级锁
; -
在数据文件存储上,InnoDB存储引擎的数据和索引集中存储,均存放在
ibd
文件中,MyISAM存储引擎的数据和索引是分开存储的,数据存放在MYD
文件中,索引存放在MYI
文件中; -
使用
select count(*) from table
查询表中具体行数时,由于MyISAM存储引擎维护了一个row_count
字段用于记录表中的条目数,所以MyISAM存储引擎的效率要高于InnoDB存储引擎,InnoDB必须采用全表扫描的方式来计算结果思考:为什么InnoDB存储引擎没有维护这个字段?
2、在开发中,选择InnoDB存储引擎还是MyISAM存储引擎?
答:略