面试题:MySQL 的索引类型有哪些?

MySQL 的索引类型可以从多个维度进行分类,以下是常见的索引类型及其特点、适用场景和创建方式的总结:


一、按数据结构分类

  1. B-Tree 索引(默认索引类型)
    • 特点
      • 基于平衡多路搜索树(B+树)实现,支持等值查询(=)、范围查询(><BETWEEN)、排序(ORDER BY)、分组(GROUP BY)等。
      • 叶子节点存储数据或主键值(InnoDB 的聚簇索引直接存储数据,非聚簇索引存储主键值)。
      • 支持前缀匹配(如 LIKE 'abc%'),但 LIKE '%abc' 无法利用索引。
    • 适用场景
      • 全值匹配、范围查询、排序、分组。
    • 创建示例CREATE INDEX idx_name ON users(name); -- 单列索引 CREATE INDEX idx_name_age ON users(name, age); -- 组合索引
  2. Hash 索引
    • 特点
      • 基于哈希表实现,仅支持等值查询(=IN),不支持范围查询或排序。
      • 查询效率高(时间复杂度为 O(1)),但存在哈希冲突问题。
      • 仅适用于内存表(MEMORY 引擎)或 InnoDB 的自适应哈希索引(自动创建)。
    • 适用场景
      • 等值查询(如缓存场景)。
    • 创建示例CREATE TABLE hash_table (id INT, name VARCHAR(100)) ENGINE = MEMORY; -- MEMORY 引擎支持显式 Hash 索引
  3. Full-Text 索引(全文索引)
    • 特点
      • 使用倒排索引技术,支持对 CHARVARCHARTEXT 列进行全文检索。
      • 仅适用于 MyISAM 和 InnoDB(MySQL 5.6+)。
      • 支持自然语言搜索(MATCH ... AGAINST)、布尔模式搜索等。
    • 适用场景
      • 文本内容搜索(如博客文章、商品描述)。
    • 创建示例CREATE FULLTEXT INDEX idx_content ON articles(content);
  4. R-Tree 索引(空间索引)
    • 特点
      • 专为多维空间数据(如地理坐标)设计,支持范围查询和空间关系查询。
      • 仅支持 GEOMETRY 数据类型,适用于 MyISAMInnoDB 等存储引擎。
    • 适用场景
      • 地理位置数据查询(如最近距离、区域查询)。
    • 创建示例CREATE TABLE locations (id INT, coord GEOMETRY) ENGINE = MyISAM; CREATE INDEX idx_coord ON locations(coord) USING RTree;

二、按索引性质分类

  1. 主键索引(Primary Key Index)
    • 特点
      • 一种特殊的唯一索引,不允许空值(NOT NULL),一个表只能有一个主键。
      • 在 InnoDB 中,主键索引是聚簇索引(数据行与索引存储在一起)。
    • 创建示例CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(32) );
  2. 唯一索引(Unique Index)
    • 特点
      • 索引列的值必须唯一,允许空值(但 NULL 可以有多个)。
      • 用于防止重复数据插入。
    • 创建示例CREATE UNIQUE INDEX idx_email ON users(email);
  3. 普通索引(Normal Index)
    • 特点
      • 最基本的索引类型,没有任何限制。
      • 用于加速查询,但不保证值的唯一性。
    • 创建示例CREATE INDEX idx_name ON users(name);
  4. 联合索引(Composite Index / 组合索引)
    • 特点
      • 多个字段组成的索引,遵循最左前缀原则
      • 适用于多列查询条件,提升联合查询性能。
    • 创建示例CREATE INDEX idx_name_age ON users(name, age);
  5. 全文索引(Full-Text Index)
    • 特点
      • 已在“按数据结构分类”中详细说明。
    • 创建示例CREATE FULLTEXT INDEX idx_content ON articles(content);
  6. 空间索引(Spatial Index)
    • 特点
      • 已在“按数据结构分类”中详细说明。
    • 创建示例CREATE INDEX idx_coord ON locations(coord) USING RTree;

三、InnoDB 引擎的聚簇索引与非聚簇索引

  1. 聚簇索引(Clustered Index)
    • 特点
      • 数据行的物理存储顺序与索引的逻辑顺序一致。
      • 主键索引默认是聚簇索引,叶子节点存储完整数据行。
    • 适用场景
      • 主键查询、范围查询、高频查询字段为索引列。
  2. 非聚簇索引(Secondary Index / 辅助索引)
    • 特点
      • 叶子节点存储主键值(需回表查询完整数据)。
      • 一个表可以有多个非聚簇索引。
    • 适用场景
      • 非主键字段查询,需通过主键回表获取数据。

四、索引选择建议

查询类型推荐索引类型
等值查询Hash 索引(Memory 引擎)
范围查询、排序B-Tree 索引
全文搜索Full-Text 索引
地理空间查询R-Tree 索引
多列联合查询联合索引(最左前缀原则)

五、注意事项

  1. 索引维护成本
    • 插入、更新、删除操作会增加索引维护开销,需权衡查询性能与写入性能。
  2. 覆盖索引
    • 查询字段全部命中索引时(如联合索引),无需回表,性能更高。
  3. 存储引擎差异
    • MyISAM 不支持全文索引(MySQL 5.6+ InnoDB 支持)。
    • Hash 索引仅在 MEMORY 引擎中显式支持。

通过合理选择索引类型并结合业务需求,可以显著提升 MySQL 的查询性能。

THE END
喜欢就支持一下吧
点赞7 分享