MySQL索引的类型有哪些?

MySQL 的索引类型丰富多样,不同的索引适用于不同的场景和数据结构。以下是常见的索引类型及其核心特点和应用场景:


1. B-Tree 索引(B+Tree)

  • 默认索引类型,适用于大多数场景(InnoDB、MyISAM 均支持)。

  • 特点

    • 按顺序存储数据,支持全值匹配、范围查询(><BETWEEN)和前缀匹配。
    • 基于 B+Tree 结构,叶子节点通过指针连接,适合排序和范围扫描。
    • 支持联合索引(最左前缀匹配原则)。
  • 适用场景

    • WHERE 条件中的等值查询、范围查询。
    • ORDER BYGROUP BY 的排序优化。
  • 示例

    sql 复制代码
    CREATE INDEX idx_name ON users(name); -- 单列索引
    CREATE INDEX idx_name_age ON users(name, age); -- 联合索引

2. 哈希索引(Hash Index)

  • 基于哈希表实现 ,仅支持精确匹配(= 查询)。

  • 特点

    • 查询速度极快(O(1) 时间复杂度)。
    • 不支持范围查询、排序或前缀匹配。
    • 只有 Memory 存储引擎显式支持哈希索引;InnoDB 支持自适应哈希索引(自动优化)。
  • 适用场景

    • 频繁的等值查询(如缓存表)。
    • 内存表(Memory 引擎)的快速查找。
  • 示例

    sql 复制代码
    CREATE TABLE cache_table (
        id INT PRIMARY KEY,
        data VARCHAR(100)
    ) ENGINE=MEMORY;
    CREATE INDEX idx_hash USING HASH ON cache_table(id);

3. 全文索引(Full-Text Index)

  • 针对文本内容的搜索优化,支持自然语言搜索。

  • 特点

    • 基于倒排索引(Inverted Index),支持关键词匹配和相关性评分。
    • 支持 MATCH() AGAINST() 语法,可处理停用词和词干提取(需配置)。
    • InnoDB(5.6+)和 MyISAM 均支持。
  • 适用场景

    • 文章、日志等大文本字段的模糊搜索(如 LIKE '%keyword%' 的优化)。
    • 实现搜索引擎类功能。
  • 示例

    sql 复制代码
    CREATE TABLE articles (
        id INT PRIMARY KEY,
        content TEXT,
        FULLTEXT(content)
    ) ENGINE=InnoDB;
    -- 查询示例
    SELECT * FROM articles WHERE MATCH(content) AGAINST('database');

4. 空间索引(R-Tree / SPATIAL Index)

  • 用于地理空间数据类型 (如 GEOMETRYPOINTPOLYGON)。

  • 特点

    • 基于 R-Tree 结构,支持空间关系计算(如距离、包含、相交)。
    • 仅 MyISAM 和 InnoDB(5.7+)支持。
  • 适用场景

    • 地理信息系统(GIS)应用。
    • 地图数据中的位置查询(如"附近的人")。
  • 示例

    sql 复制代码
    CREATE TABLE locations (
        id INT PRIMARY KEY,
        position POINT NOT NULL,
        SPATIAL INDEX(position)
    ) ENGINE=MyISAM;
    -- 查询附近10公里内的点
    SELECT * FROM locations 
    WHERE ST_Distance_Sphere(position, POINT(116.39, 39.9)) <= 10000;

5. 前缀索引(Prefix Index)

  • 对字段的前 N 个字符建立索引,节省存储空间。

  • 特点

    • 需权衡前缀长度与选择性(避免重复值过多)。
    • 适用于长字符串(如 VARCHAR(255))。
  • 适用场景

    • 长文本字段的部分索引优化。
    • 减少索引占用的磁盘空间。
  • 示例

    sql 复制代码
    CREATE INDEX idx_email_prefix ON users(email(10)); -- 对email前10字符建索引

6. 覆盖索引(Covering Index)

  • 索引包含查询所需的所有字段,无需回表查询数据行。

  • 特点

    • 通过 EXPLAINExtra 列显示 Using index
    • 显著减少 I/O 操作,提升查询速度。
  • 适用场景

    • 高频查询仅需索引字段的场景。
    • 优化聚合查询(如 COUNT(*)SUM())。
  • 示例

    sql 复制代码
    -- 创建联合索引(包含查询所需字段)
    CREATE INDEX idx_covering ON orders(user_id, status, amount);
    -- 查询示例(无需回表)
    SELECT user_id, amount FROM orders WHERE status = 'paid';

7. 唯一索引(Unique Index)

  • 强制索引列的值唯一(允许 NULL 值,但最多一个 NULL)。

  • 特点

    • 主键索引(PRIMARY KEY)是特殊的唯一索引(不允许 NULL)。
    • 用于数据完整性约束。
  • 示例

    sql 复制代码
    CREATE UNIQUE INDEX idx_unique_email ON users(email);

8. 自适应哈希索引(Adaptive Hash Index)

  • InnoDB 自动为热点数据创建的哈希索引,无需手动干预。
  • 特点
    • 对频繁访问的索引页自动生成哈希索引。
    • 提升等值查询性能,但对范围查询无效。

总结:如何选择索引类型?

  1. 通用场景 :优先使用 B-Tree 索引(默认选择)。
  2. 精确匹配 :高频等值查询可考虑 哈希索引(Memory 引擎)。
  3. 文本搜索 :使用 全文索引 替代 LIKE 模糊查询。
  4. 空间数据 :GIS 应用选择 空间索引
  5. 长字段优化 :使用 前缀索引 减少存储开销。
  6. 查询加速 :通过 覆盖索引 避免回表。

通过合理选择索引类型,可以显著提升查询性能并降低资源消耗。

相关推荐
canonical_entropy8 小时前
从同步范式到组合范式:作为双向/δ-lenses泛化的可逆计算理论
后端·低代码·领域驱动设计
Funcy8 小时前
XxlJob 源码分析06:任务执行流程(一)之调度器揭秘
后端
AAA修煤气灶刘哥9 小时前
数据库优化自救指南:从SQL祖传代码到分库分表的骚操作
数据库·后端·mysql
excel10 小时前
应用程序协议注册的原理与示例
前端·后端
ytadpole11 小时前
揭秘xxl-job:从高可用到调度一致性
java·后端
Moonbit12 小时前
MoonBit 三周年 | 用代码写就 AI 时代的语言答卷
后端·程序员·编程语言
菜鸟谢12 小时前
QEMU
后端
bobz96512 小时前
calico vxlan 默认不依赖 BGP EVPN 携带 VNI
后端
bobz96512 小时前
vxlan 和 vlan 的不同点
后端
艾雅法拉拉12 小时前
JS知识点回顾(1)
前端·javascript·面试