MySQL 的存储引擎有哪些?它们之间有什么区别? MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别? MySQL 的索引类型有哪些?

MySQL 的存储引擎有哪些?它们之间有什么区别?

先来回顾以下我们业务场景下一般的数据库访问的过程应用——>server层 ——>存储引擎层——>磁盘

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=!%5B%E5%9C%A8%E8%BF%99%E9%87%8C%E6%8F%92%E5%85%A5%E5%9B%BE%E7%89%87%E6%8F%8F%E8%BF%B0%5D(https%3A%2F%2Fi-blog.csdnimg.cn%2Fdirect%2F9c8e7718dbac4c00818446178c9194ab.png&pos_id=img-u1pj8Lcs-1739961024355)
https://i-blog.csdnimg.cn/direct/cdc2786ac8d54e57869281702d70cacf.png)

官网描述:

InnoDB: MySQL 8.4 中的默认存储引擎。 InnoDB 是事务安全(符合 ACID) 存储引擎,具有 commit、rollback 和 崩溃恢复功能来保护用户数据。 InnoDB 行级锁定(无升级 到更粗粒度的锁)和 Oracle 样式一致 非锁定读取增加了多用户并发性,并且 性能。 InnoDB 将用户数据存储在 聚集索引,用于减少基于的常见查询的 I/O 主键。为了维护数据完整性, InnoDB 还支持 FOREIGN KEY 引用完整性约束。

MyISAM: 这些表占用空间小表级锁定 限制了读/写工作负载的性能,因此它通常是 用于 Web 和数据中的只读或只读工作负载 仓储配置。

Memory: 将所有数据存储在 RAM 中,以便在 需要快速查找非关键数据。这个引擎是以前称为 HEAP 发动机。它的用途案例正在减少; InnoDB 及其缓冲区 池内存区域提供了一种通用且持久的方式 将大部分或全部数据保留在内存中,以及 NDBCLUSTER 提供快速的键值查找 用于大型分布式数据集。

总结: 节选自面试鸭 作者:木子金又二丨

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?

同问方式

什么是聚集索引,什么是二级索引(非聚集索引)
什么是回表?

在这里插入图片描述

聚集索引的选取规则

1.如果存在主键,主键就是一个聚集索引。

2.如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。

3.如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

在这里插入图片描述

总结:

聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个。

非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个。

回表查询:通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表

MySQL 的索引类型有哪些?

一、按 数据结构 分类

  1. B+Tree 索引
    • 特点:MySQL 默认的索引结构,支持范围查询和排序,适用于大部分场景。
    • 适用场景=, >, <, BETWEEN, ORDER BY 等操作。
    • 支持引擎:InnoDB、MyISAM、Memory 等。
  2. Hash 索引
    • 特点:基于哈希表实现,仅支持精确匹配(等值查询),查询速度快,但不支持范围查询和排序。
    • 适用场景:等值查询(如 WHERE key = value)。
    • 支持引擎:Memory 引擎显式支持,InnoDB 支持自适应哈希索引(内部自动管理,用户无法手动创建)。
  3. 全文索引(Full-Text)
    • 特点:针对文本内容分词检索,支持自然语言搜索和关键词匹配。
    • 适用场景:大文本字段(如 CHARVARCHARTEXT)的全文搜索。
    • 支持引擎:MyISAM 和 InnoDB(MySQL 5.6+)。
  4. 空间索引(R-Tree)
    • 特点:用于地理空间数据类型(如 GEOMETRYPOINTPOLYGON),支持空间关系计算。
    • 适用场景:地理数据查询(如距离计算、区域覆盖)。
    • 支持引擎:MyISAM(早期)和 InnoDB(MySQL 5.7+)。

二、按 逻辑功能 分类

  1. 主键索引(Primary Key)
    • 特点:唯一且非空,每个表只能有一个主键索引。
    • 数据结构:InnoDB 中主键索引是聚簇索引(数据与索引存储在一起)。
  2. 唯一索引(Unique Key)
    • 特点:确保列值唯一,允许 NULL 值(但 NULL 可重复)。
    • 数据结构:B+Tree。
  3. 普通索引(Normal Index)
    • 特点:最基本的索引,无唯一性约束,仅加速查询。
    • 数据结构:B+Tree。
  4. 组合索引(Composite Index)
    • 特点:多个列组合成的索引,遵循 最左前缀原则
    • 示例:索引 (a, b, c) 可支持 WHERE a=1WHERE a=1 AND b=2,但不支持 WHERE b=2
  5. 前缀索引(Prefix Index)
    • 特点:对长文本字段的前 N 个字符建立索引,节省存储空间。
    • 语法CREATE INDEX idx_name ON table (column(N))
  6. 覆盖索引(Covering Index)
    • 特点:查询的列全部包含在索引中,无需回表查询数据行。
    • 优化点:显著减少 I/O 操作,提升查询性能。

三、其他特殊索引

  1. 自适应哈希索引(Adaptive Hash Index)
    • 特点:InnoDB 自动为频繁访问的索引页创建哈希索引,用户不可控。
    • 作用:加速等值查询。
  2. 倒排索引(Inverted Index)
    • 特点:全文索引的底层实现,通过分词建立词条到文档的映射。

四、存储引擎对索引的支持

索引类型InnoDBMyISAMMemory
B+Tree
Hash❌(仅自适应)
全文索引(FULLTEXT)✅(5.6+)
空间索引(R-Tree)✅(5.7+)

五、选择索引的建议

  1. 高频查询字段:优先考虑使用索引。
  2. 区分度高:选择区分度高的列(如用户ID)建立索引。
  3. 避免冗余:合理设计组合索引,避免单列重复索引。
  4. 更新代价:索引会降低写操作速度,需权衡读写比例。
    查询字段**:优先考虑使用索引。
  5. 区分度高:选择区分度高的列(如用户ID)建立索引。
  6. 避免冗余:合理设计组合索引,避免单列重复索引。
  7. 更新代价:索引会降低写操作速度,需权衡读写比例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值