MySQL 索引介绍

MySQL 中的索引类型多样,主要根据数据结构和应用场景进行分类。以下是详细的分类和说明:


一、按数据结构分类

  1. B-Tree 索引(实际为 B+Tree)

    • 特点:适用于全值匹配、范围查询(><BETWEEN)和前缀匹配(最左前缀原则)。
    • 支持引擎:InnoDB、MyISAM、Memory 等。
    • 示例WHERE a=10 AND b>20 可使用 (a,b) 的组合索引。
  2. 哈希索引

    • 特点:仅支持精确等值查询(=IN()),查询速度极快,但不支持范围查询。
    • 支持引擎:Memory 引擎显式支持,InnoDB 通过自适应哈希索引(内部自动管理)隐式支持。
    • 局限性:哈希冲突可能影响性能,无法用于排序。
  3. 全文索引(FULLTEXT)

    • 特点:用于文本内容的全文搜索(如 MATCH ... AGAINST),支持分词和关键词匹配。
    • 支持引擎:MyISAM 和 InnoDB(5.6+)。
    • 适用场景:文章搜索、日志分析等文本处理。
  4. 空间索引(SPATIAL)

    • 特点:用于地理空间数据类型(如 GEOMETRYPOINT),遵循 OpenGIS 标准。
    • 支持引擎:MyISAM 和 InnoDB(5.7+)。
    • 应用场景:地图应用中的位置查询(如距离计算、区域覆盖)。

二、按应用维度分类

  1. 普通索引

    • 定义:最基本的索引,无唯一性约束。
    • 语法CREATE INDEX idx_name ON table(column);
  2. 唯一索引

    • 定义:索引列值必须唯一,允许 NULL 值。
    • 语法CREATE UNIQUE INDEX idx_name ON table(column);
  3. 主键索引

    • 定义:特殊的唯一索引,不允许 NULL 值,每个表仅一个。
    • 语法PRIMARY KEY 约束自动创建。
  4. 组合索引(联合索引)

    • 定义:多个列组合创建的索引,遵循最左前缀原则。
    • 示例:索引 (a,b,c) 支持 WHERE a=1 AND b=2,但不支持 WHERE b=2
  5. 覆盖索引

    • 定义:查询的列均在索引中,无需回表查询数据行。
    • 优势:显著提升性能,减少 I/O 操作。
    • 示例SELECT a,b FROM table WHERE a=10,若索引为 (a,b) 则可覆盖。
  6. 前缀索引

    • 定义:对字符串列的前 N 个字符创建索引,节省空间。
    • 语法CREATE INDEX idx_name ON table(column(10));

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

索引类型 InnoDB MyISAM Memory
B-Tree ✔️ ✔️ ✔️(可显式指定)
哈希索引 ❌(自适应哈希) ✔️
全文索引 ✔️(5.6+) ✔️
空间索引 ✔️(5.7+) ✔️

四、其他关键概念

  • 聚簇索引(InnoDB):数据按主键物理排序存储,主键索引的叶子节点直接包含数据行。
  • 非聚簇索引(MyISAM):索引与数据分离,叶子节点存储指向数据行的指针。
  • 自适应哈希索引(InnoDB):自动为频繁访问的索引页创建哈希索引,加速等值查询。

五、索引选择建议

  1. 高频查询字段优先建索引。
  2. 区分度高的列(如用户ID)更适合索引。
  3. 避免过度索引:索引会增加写操作开销。
  4. 长文本使用前缀索引或全文索引。
  5. 组合索引需注意列顺序,优先高频、高区分度列。

通过合理选择索引类型和策略,可以显著提升查询性能,但需结合实际场景权衡利弊。

你可能感兴趣的:(mysql)