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查询数据需要进行两次查询(先通过索引查出数据所在的地址,然后再查询真正的数据)。

相关推荐
SelectDB4 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
ClouGence5 小时前
开源数据库管理工具 CloudDM 4.2.0 发布,新增 GoldenDB、KingbaseES 等数据源
数据库·dba·devops
用户3126874877205 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
发霉的馒头5 小时前
ORA-00845: MEMORY_TARGET not supported on this system的解决方法
数据库
vipxieliang5 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing5 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
ikun_文6 小时前
Django框架路由Router的使用
python·pycharm·django
IvanCodes6 小时前
Python 基础语法(二):字符串与常用操作
python
昭昭日月明6 小时前
LangChain 生态:从链到代理,开发者需要掌握的三大核心
python·langchain·agent
Csvn6 小时前
🐍 Day 8:面向对象编程
后端·python