区别:
- 事务: InnoDB支持事务(四种隔离级别), 事务安全, MyISAM不支持事务, 每次查询都是原子的.
- 锁: InnoDB行级锁, MyISAM只能针对于表加锁
- 外键: InnoDB支持外键, MyISAM不支持. 但是规范上最好不使用外键.
- 索引: InnoDB MySQL5.6支持全文索引, 5.6 之前MyISAM支持全文索引
- 索引的存储方式: InnoDB聚簇索引, MyISAM非聚簇索引.
- 总行数: MyISAM存储总行数, innodb不存储总行数.
事务 | 外键 | 锁粒度 | 索引存储方式 | 表空间 | 关注点 | |
---|---|---|---|---|---|---|
InnoDB | √ | √ | 表锁和行锁 | 聚簇和非聚簇 | 大 | 事务,高并发 |
MyISAM | × | × | 只有表锁 | 只非聚簇 | 小 | 性能 |
使用场景:
MyISAM效率快于InnoDB但是只适用于小型应用(因为表空间小), 跨平台支持(把表保存成文件), 还有就是大量的select.
==面试延伸: ==
如果问到了: 聚簇索引 可以(可能)引申到-> B树, B+树
点击此处链接
如果有很大帮助, 拜托点个赞, 说实话点个赞的话真的我能开心一天.
以下是补充和说明:
InnoDB事务的四种隔离级别
READ UNCOMMITTED读未提交
READ COMMITTED读已提交 (最常用的隔离级别)
REPEATABLE READ可重复读 (InnoDB默认)
SERIALIZABLE串行化
引申问题:
- 分别解决什么问题? 怎么解决的?
读未提交会产生脏读, 不可重复读, 幻读问题.
实现: 读不加锁, 所有的写加行级锁.
读已提交避免了脏读现象, 存在不可重复读和幻读问题.
实现: 使用MVCC技术, 在每一行加入隐藏的字段(DB_TRX_ID: 修改该行的最后一个事务的id, DB_ROLL_PTR: 指向当前行的undo log日志, DB_ROW_ID: 行标识, DBLETE_BIT: 删除标志)
也是读不加锁, 写加行级锁.
每次写入数据, 数据行中隐藏列DATA_POLL_PTR存储指向UNDO记录的指针.
每次读数据, 如果该行被其他事务锁定,顺着隐藏列DATA_POLL_PTR指针, 找到上一个有效的记录
可重复读防止了脏读和不可重复读, 存在幻读.
也是MVCC实现, 写加行级锁, 读不加锁. 和读已提交的区别就是行记录对于当前事务的可见性. 读已提交对数据的可见性是该数据的最新记录, 而可重复读对数据的可见性是事务开始时, 该数据的记录.
串行, 防止脏读, 幻读, 不可重复读. 但是并发效率最低.
实现: 读写全部加锁.- 怎么看隔离级别 show variables like ‘transaction%’
- 怎么设置隔离级别 set [session/global] transaction level xxx
什么是聚簇索引和非聚簇索引?
MyISAM和InnoDB除了表结构文件都是.frm文件之外,
MyISAM有两个文件存储信息, .myd(d代表Data存放数据)和 .myi(i代表Index存放索引), 索引文件的数据域存储指向数据文件的指针.
InnoDB只有一个**.ibd**文件(d代表data)存放索引和数据文件, 索引和数据在一个文件中就被称为聚簇索引.