训练营1:Mysql的存储引擎有哪些?它们之间有什么区别?
一.总结
MySQL支持多种存储引擎,主要的存储引擎是InnoDB和MYISAM,他们的核心差异在于事务支持、锁粒度、存储方式、索引结构、崩溃恢复机制。
二.细分
1.MySQL常见的存储引擎有哪些
- InnoDB
- MYISAM
- Memory
- Archive
2.InnoDB和MYISAM的区别是什么?
- InnoDB(默认存储引擎5.5+)
- 支持事务ACID,通过redo log、undo log、MVCC来实现
- 支持行级锁,也支持表级锁,支持外键
- 具有崩溃恢复机制,通过redo log实现
- 索引结构为聚簇索引(B+树),数据与索引存储在.ibd文件中,叶子节点存放完整数据行
- 从mysql5.6开始支持全文索引
- 适合高并发写和数据一致性的场景
- MYISAM
- 不支持事务和行级锁(仅表锁)
- 不支持外键和崩溃恢复
- 支持自适应哈希索引,不支持全文索引
- 索引结构为非聚簇索引B+树,文件是分开存储的, 数据(.MYD), 索引(.MYI), 表结构(.sdi)(5.7之前是.frm),所以它的叶子节点存放的是索引列和地址值,通过地址值查询.MYD文件找到完整数据行
- 适合读多写少的场景
3.核心维度矩阵 (表格记忆)
| 特性维度 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | ✅ ACID | ❌ |
| 锁粒度 | 行级锁 | 表级锁 |
| 外键约束 | ✅ | ❌ |
| 崩溃恢复 | ✅ Redo Log | ❌(需修复表) |
| 索引类型 | 聚集索引+B-Tree | 非聚集索引+B-Tree |
4.拓展延申
- 你提到了聚簇和非聚簇索引,它们的区别是什么?
- 聚簇索引:InnoDB的主键索引,数据与索引存储在一起。
- 非聚簇索引:InnoDB的二级索引叶子节点存放索引列和主键值,需回表查询;MyISAM的所有索引均为非聚簇索引,叶子节点存放索引列和地址值,数据与索引分离。
- 为什么innoDB使用的是B+树,而不是B树?
- 数据分:B树数据存放在每个节点中,而B+树非叶子节点存放索引列(主键),叶子节点存放索引列和数据,这样也会数据冗余(多次存放主键)
- 树的高度分:B树每个叶子节点都存放数据,而一页只能存放16kb,每页存放数据较少导致树的高度较高,查询效率不固定;B+树数据只存放在叶子节点中,树的高度矮胖,时间复杂度固定为o(log n)。
- 指针:B树指针不相连,B+树叶子节点指针互相连接形成双向链表,范围查询比B树快
5.高频陷阱题
1. InnoDB的主键设计
- 陷阱:
"InnoDB表如果没有显式定义主键,会发生什么?" - 答案:
- InnoDB会隐式创建一个6字节的ROW_ID作为主键。
- 问题:ROW_ID是全局的,可能导致性能瓶颈。
- 避坑建议:
- 显式定义主键,优先选择自增整数。
2. MyISAM的并发性能
- 陷阱:
"为什么MyISAM在高并发写入场景下性能差?" - 答案:
- MyISAM仅支持表级锁,写操作会锁住整个表。
- 频繁更新时,索引指针维护成本高。
- 避坑建议:
- 读多写少的场景使用MyISAM,写密集型场景使用InnoDB。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
