思维导图

一、存储引擎
MySQL 常见的存储引擎有 InnoDB、MyISAM 和 Memory。
InnoDB
- 是 Mysql 5.5 之后的默认引擎
- 存储在硬盘,++存储量受限,存储限制 64TB++
- 支持事务、行级锁和外键
- 具有事务提交、回滚和崩溃恢复,还有数据缓存、聚簇索引、全文索引等功能
- 适合高负载的 OLTP 应用
MyISAM
- 是 MysqL 5.5 之前的默认引擎
- 存储在硬盘,++存储量最大,存储限制为 256TB++
- 不支持事务、行级锁和外键,只支持表锁
- 锁的粒度较大,更新性能较差
- 比较适合读多写少的场景。
Memory
- Memroy 是存储于内存中的
- 数据的读写还是很快的,但是数据不具有持久性
- 只适合临时存储的场景。
二、相关面试题
MySQL 有哪些存储引擎?
首先有Innodb引擎,它提供了对数据库ACID事务的支持,并且还提供了行级锁和外键的约束。Innodb的设计目标就是处理大数据容量的数据库系统;
还有MyIASM引擎,它是原本Mysql的默认引擎,不提供事务的支持,也不支持行级锁和外键;
最后还有一个MEMORY引擎,它的所有数据都在内存中,数据的处理速度快,但是安全性不高,很少使用。
MyISAM 和 InnoDB 有什么区别?
- 最根本:MyISAM 只支持表锁,InnoDB 支持行锁,高并发写差距巨大。
- 事务:MyISAM 压根没有,InnoDB 完整 ACID、支持回滚。
- 奔溃恢复:MyISAM 崩溃后大概率要 repair,InnoDB 用 redo/undo 自动恢复。
- 外键:MyISAM 不支持,InnoDB 支持外键约束。
- 索引:MyISAM 索引叶子存记录地址,InnoDB 主键叶子即数据,二级索引回表用主键值。
- 存储文件:MyISAM 分 .MYD(数据)+.MYI(索引),InnoDB 用 .ibd 或共享表空间。
- 全文索引:老版本 MyISAM 有,InnoDB 5.6 起也支持,实际用 ES 更多。
- 计数器:
SELECT COUNT(*)MyISAM 瞬间给出,InnoDB 要全表或索引扫描。一句话收尾: "读多写少、不要求事务用 MyISAM 图个简单;在线事务、高并发、必用 InnoDB。"
追问:为什么MyISAM比InnoDB快?**
具体的有以下几点:
- MyISAM 只缓存了索引块,减少了缓存换入换出的频率(因为每次更新数据都需要更新缓存)
- MyISAM的表结构非聚簇索引,而InnoDB是聚簇索引,InnoDB的二级索引需要找到id回表查一级索引,而MyISAM所有的索引直接指向数据行的存储位置offset。
- InnoDB还需要维护MVCC一致,虽然你的场景没有,但它还是需要去检查和维护,而Myisam 表锁.牺牲了写性能,提高了读性能。
追问:你上面提到了支持行级锁,那你了解++行级锁锁的到底是什么++么?
其实行级锁根据锁的粒度还可以划分为:
- 记录锁(Record Lock)锁的是索引记录,
- 间隙锁(Gap Lock)锁的是索引记录之间的间隙,
- 临键锁(Next-Key Lock)临键锁是间隙锁和记录锁的组合,同时锁索引记录和间隙,范围是左开右闭。
追问:上面说了行级锁,你是否可以讲下****++InnoDB的锁机制++**** ++?++
锁机制分类根据不同的划分类型可以归类为
- 按照 锁的粒度 ,可分为全局锁、表级锁、行级锁、页级锁(innoDB中没有)
- 按照 锁的级别 ,可分为共享锁、排他锁
- 按照 加锁的方式 ,可分为自动锁、显示锁
- 按照 锁的使用方式 ,可分为乐观锁、悲观锁
追问:MyISAM的索引结构存在什么问题?
通过前面提到的MyISAM的特点,可以发现它的结构文件是三个,分别是表结构、数据行、索引,而InnoDB的文件是两个。所以我们可以了解到MyISAM的与InnoDB最大不同就是MyISAM采用了数据与索引分离的存储方式,也就是说两者是相互独立的,也是因为如此,MyISAM的索引都为非聚簇索引,同时也会导致MyISAM查询数据需要进行两次查询(先通过索引查出数据所在的地址,然后再查询真正的数据)。