MySQL【存储引擎】:InnoDB、MyISAM、Memory...

思维导图

一、存储引擎

MySQL 常见的存储引擎有 InnoDB、MyISAM 和 Memory。

InnoDB

  1. 是 Mysql 5.5 之后的默认引擎
  2. 存储在硬盘,++存储量受限,存储限制 64TB++
  3. 支持事务、行级锁和外键
  4. 具有事务提交、回滚和崩溃恢复,还有数据缓存、聚簇索引、全文索引等功能
  5. 适合高负载的 OLTP 应用

MyISAM

  1. 是 MysqL 5.5 之前的默认引擎
  2. 存储在硬盘,++存储量最大,存储限制为 256TB++
  3. 不支持事务、行级锁和外键,只支持表锁
  4. 锁的粒度较大,更新性能较差
  5. 比较适合读多写少的场景。

Memory

  1. Memroy 是存储于内存中的
  2. 数据的读写还是很快的,但是数据不具有持久性
  3. 只适合临时存储的场景。

二、相关面试题

MySQL 有哪些存储引擎?

首先有Innodb引擎,它提供了对数据库ACID事务的支持,并且还提供了行级锁和外键的约束。Innodb的设计目标就是处理大数据容量的数据库系统;

还有MyIASM引擎,它是原本Mysql的默认引擎,不提供事务的支持,也不支持行级锁和外键;

最后还有一个MEMORY引擎,它的所有数据都在内存中,数据的处理速度快,但是安全性不高,很少使用。

MyISAM 和 InnoDB 有什么区别?

  1. 最根本:MyISAM 只支持表锁,InnoDB 支持行锁,高并发写差距巨大。
  2. 事务:MyISAM 压根没有,InnoDB 完整 ACID、支持回滚。
  3. 奔溃恢复:MyISAM 崩溃后大概率要 repair,InnoDB 用 redo/undo 自动恢复。
  4. 外键:MyISAM 不支持,InnoDB 支持外键约束。
  5. 索引:MyISAM 索引叶子存记录地址,InnoDB 主键叶子即数据,二级索引回表用主键值。
  6. 存储文件:MyISAM 分 .MYD(数据)+.MYI(索引),InnoDB 用 .ibd 或共享表空间。
  7. 全文索引:老版本 MyISAM 有,InnoDB 5.6 起也支持,实际用 ES 更多。
  8. 计数器:SELECT COUNT(*) MyISAM 瞬间给出,InnoDB 要全表或索引扫描。

一句话收尾: "读多写少、不要求事务用 MyISAM 图个简单;在线事务、高并发、必用 InnoDB。"

追问:为什么MyISAM比InnoDB快?**

具体的有以下几点:

  1. MyISAM 只缓存了索引块,减少了缓存换入换出的频率(因为每次更新数据都需要更新缓存)
  2. MyISAM的表结构非聚簇索引,而InnoDB是聚簇索引,InnoDB的二级索引需要找到id回表查一级索引,而MyISAM所有的索引直接指向数据行的存储位置offset。
  3. InnoDB还需要维护MVCC一致,虽然你的场景没有,但它还是需要去检查和维护,而Myisam 表锁.牺牲了写性能,提高了读性能。

追问:你上面提到了支持行级锁,那你了解++行级锁锁的到底是什么++么?

其实行级锁根据锁的粒度还可以划分为:

  • 记录锁(Record Lock)锁的是索引记录,
  • 间隙锁(Gap Lock)锁的是索引记录之间的间隙,
  • 临键锁(Next-Key Lock)临键锁是间隙锁和记录锁的组合,同时锁索引记录和间隙,范围是左开右闭。

追问:上面说了行级锁,你是否可以讲下****++InnoDB的锁机制++**** ++?++

锁机制分类根据不同的划分类型可以归类为

  1. 按照 锁的粒度 ,可分为全局锁、表级锁、行级锁、页级锁(innoDB中没有)
  2. 按照 锁的级别 ,可分为共享锁、排他锁
  3. 按照 加锁的方式 ,可分为自动锁、显示锁
  4. 按照 锁的使用方式 ,可分为乐观锁、悲观锁

追问:MyISAM的索引结构存在什么问题?

通过前面提到的MyISAM的特点,可以发现它的结构文件是三个,分别是表结构、数据行、索引,而InnoDB的文件是两个。所以我们可以了解到MyISAM的与InnoDB最大不同就是MyISAM采用了数据与索引分离的存储方式,也就是说两者是相互独立的,也是因为如此,MyISAM的索引都为非聚簇索引,同时也会导致MyISAM查询数据需要进行两次查询(先通过索引查出数据所在的地址,然后再查询真正的数据)。

相关推荐
明月_清风6 分钟前
Python 性能微观世界:列表推导式 vs for 循环
后端·python
明月_清风9 分钟前
Python 性能翻身仗:从 O(n) 到 O(1) 的工程实践
后端·python
helloweilei16 小时前
python 抽象基类
python
用户83562907805116 小时前
Python 实现 PPT 转 HTML
后端·python
0xDevNull16 小时前
MySQL索引进阶用法
后端·mysql
0xDevNull17 小时前
MySQL索引用法
mysql
雨中飘荡的记忆17 小时前
保证金系统入门到实战
java·后端
Nyarlathotep011317 小时前
Java内存模型
java
IvorySQL18 小时前
PostgreSQL 技术日报 (3月6日)|为什么 Ctrl-C 在 psql 里让人不安?
数据库·postgresql·开源
NineData19 小时前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库