MySQL 的存储引擎有哪些?它们之间有什么区别? MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别? MySQL 的索引类型有哪些?
MySQL 的存储引擎有哪些?它们之间有什么区别?
先来回顾以下我们业务场景下一般的数据库访问的过程应用——>server层 ——>存储引擎层——>磁盘
官网描述:
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 的索引类型有哪些?
一、按 数据结构 分类
- B+Tree 索引
- 特点:MySQL 默认的索引结构,支持范围查询和排序,适用于大部分场景。
- 适用场景:
=
,>
,<
,BETWEEN
,ORDER BY
等操作。 - 支持引擎:InnoDB、MyISAM、Memory 等。
- Hash 索引
- 特点:基于哈希表实现,仅支持精确匹配(等值查询),查询速度快,但不支持范围查询和排序。
- 适用场景:等值查询(如
WHERE key = value
)。 - 支持引擎:Memory 引擎显式支持,InnoDB 支持自适应哈希索引(内部自动管理,用户无法手动创建)。
- 全文索引(Full-Text)
- 特点:针对文本内容分词检索,支持自然语言搜索和关键词匹配。
- 适用场景:大文本字段(如
CHAR
、VARCHAR
、TEXT
)的全文搜索。 - 支持引擎:MyISAM 和 InnoDB(MySQL 5.6+)。
- 空间索引(R-Tree)
- 特点:用于地理空间数据类型(如
GEOMETRY
、POINT
、POLYGON
),支持空间关系计算。 - 适用场景:地理数据查询(如距离计算、区域覆盖)。
- 支持引擎:MyISAM(早期)和 InnoDB(MySQL 5.7+)。
- 特点:用于地理空间数据类型(如
二、按 逻辑功能 分类
- 主键索引(Primary Key)
- 特点:唯一且非空,每个表只能有一个主键索引。
- 数据结构:InnoDB 中主键索引是聚簇索引(数据与索引存储在一起)。
- 唯一索引(Unique Key)
- 特点:确保列值唯一,允许 NULL 值(但 NULL 可重复)。
- 数据结构:B+Tree。
- 普通索引(Normal Index)
- 特点:最基本的索引,无唯一性约束,仅加速查询。
- 数据结构:B+Tree。
- 组合索引(Composite Index)
- 特点:多个列组合成的索引,遵循 最左前缀原则。
- 示例:索引
(a, b, c)
可支持WHERE a=1
、WHERE a=1 AND b=2
,但不支持WHERE b=2
。
- 前缀索引(Prefix Index)
- 特点:对长文本字段的前 N 个字符建立索引,节省存储空间。
- 语法:
CREATE INDEX idx_name ON table (column(N))
。
- 覆盖索引(Covering Index)
- 特点:查询的列全部包含在索引中,无需回表查询数据行。
- 优化点:显著减少 I/O 操作,提升查询性能。
三、其他特殊索引
- 自适应哈希索引(Adaptive Hash Index)
- 特点:InnoDB 自动为频繁访问的索引页创建哈希索引,用户不可控。
- 作用:加速等值查询。
- 倒排索引(Inverted Index)
- 特点:全文索引的底层实现,通过分词建立词条到文档的映射。
四、存储引擎对索引的支持
索引类型 | InnoDB | MyISAM | Memory |
---|---|---|---|
B+Tree | ✅ | ✅ | ✅ |
Hash | ❌(仅自适应) | ❌ | ✅ |
全文索引(FULLTEXT) | ✅(5.6+) | ✅ | ❌ |
空间索引(R-Tree) | ✅(5.7+) | ✅ | ❌ |
五、选择索引的建议
- 高频查询字段:优先考虑使用索引。
- 区分度高:选择区分度高的列(如用户ID)建立索引。
- 避免冗余:合理设计组合索引,避免单列重复索引。
- 更新代价:索引会降低写操作速度,需权衡读写比例。
查询字段**:优先考虑使用索引。 - 区分度高:选择区分度高的列(如用户ID)建立索引。
- 避免冗余:合理设计组合索引,避免单列重复索引。
- 更新代价:索引会降低写操作速度,需权衡读写比例。