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

相关推荐
高级程序源几秒前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
IT研究室8 分钟前
最新计算机毕业设计选题推荐-基于spring boot的文学名著分享系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
码途行者10 分钟前
缓存一致性难题:Redis 和数据库如何做到数据一致?
数据库·redis
denlaku11 分钟前
JDK 13 新特性详解
java·开发语言
秋饼11 分钟前
Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层
java·ai·技术分享·后端开发
SelectDB12 分钟前
Doris VARIANT 速查:类型映射、建表写法、索引配置与常见注意点
大数据·数据库·数据分析
打工仔折腾 AI13 分钟前
极空间用 Docker 部署 Photopea:网页版 PS 的私有化实践
运维·后端·python·docker·容器·langchain·ai agent 实战
今年下半年20 分钟前
【防重放】Spring Boot 通过自定义注解实现接口防重放
java·spring boot·自定义注解·防重放
Eiceblue22 分钟前
使用 Python 实现 Excel 行列转置(保留单元格样式)
前端·python·excel
WeiXin_DZbishe23 分钟前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计