当前位置: 首页 > article >正文

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. 更新代价:索引会降低写操作速度,需权衡读写比例。

http://www.kler.cn/a/554180.html

相关文章:

  • 青龙圣者的训练脚本训练 Flux lora
  • 基于 Spring Boot + 微信小程序的短文写作竞赛管理系统设计与实现(源码+文档)
  • 力扣-二叉树-236 二叉树的最近公共祖先
  • 基于微信小程序的家政服务预约系统的设计与实现(php论文源码调试讲解)
  • 开源语音克隆项目 OpenVoice V2 本地部署
  • umi react+antd 判断渲染消息提示、input搜索、多选按钮组
  • 使用Java爬虫获取1688店铺所有商品信息(item_search_shop API接口)
  • 前端自动化部署的极简方案
  • 985本硕,网络安全方向,走算法还是走开发?
  • 软件测试面试题精选33道,附答案+文档
  • 前端函数在开发环境与生产环境中处理空字符串的差异及解决方案
  • RMSNorm算子的CUDA实现
  • AI前端开发技能提升与ScriptEcho:拥抱智能时代的新机遇
  • 【C++】 Flow of Control
  • vscode通过ssh连接服务器实现免密登录+删除
  • (leetcode42 前缀后缀最值)接雨水
  • MySQL数据库(4)—— 数据类型
  • JavaScript系列(75)--代理模式专题
  • 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践
  • 六、线程间的协作原理场景剖析