| 事务 | 外键 | 锁粒度 | 索引存储方式 | 表空间 | 关注点 | |
|---|---|---|---|---|---|---|
| InnoDB | √ | √ | 表锁和行锁 | 聚簇和非聚簇 | 大 | 事务,高并发 |
| MyISAM | × | × | 只有表锁 | 只非聚簇 | 小 | 性能 |
MyISAM效率快于InnoDB但是只适用于小型应用(因为表空间小), 跨平台支持(把表保存成文件), 还有就是大量的select.
==面试延伸: ==
如果问到了: 聚簇索引 可以(可能)引申到-> B树, B+树
点击此处链接
如果有很大帮助, 拜托点个赞, 说实话点个赞的话真的我能开心一天.
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)存放索引和数据文件, 索引和数据在一个文件中就被称为聚簇索引.