训练营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.核心维度矩阵 (表格记忆)

特性维度InnoDBMyISAM
事务支持✅ 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个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP