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. 查询加速 :通过 覆盖索引 避免回表。

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

相关推荐
REDcker9 分钟前
个人博客网站建设指南 Markdown资产化与静态站选型部署
前端·后端·博客·markdown·网站·资产·建站
Supersist27 分钟前
【设计模式03】使用模版模式+责任链模式优化实战
后端·设计模式·代码规范
Fox爱分享41 分钟前
字节二面:10亿数据毫秒级查手机尾号后4位,答不出“异构索引”直接挂?
java·后端·面试
WaywardOne1 小时前
Flutter面试事件队列,微任务队列以及事件循环相关问题及回答
flutter·面试
折哥的程序人生 · 物流技术专研1 小时前
《Java面试85题图解版(二)》进阶深化上篇:并发编程 + JVM
java·开发语言·后端·面试
Mahir081 小时前
MySQL 数据一致性的基石:三大日志( redo log/undo log/binlog)与两阶段提交(Prepare 阶段和Commit 阶段)深度解密
数据库·后端·mysql·面试
L0CK1 小时前
Redis 内存淘汰策略
后端
zhengzizhe1 小时前
ReBAC 与 Google Zanzibar:权限系统的未来
后端·架构
用户8356290780511 小时前
使用 Python 自动创建 Excel 折线图
后端·python
梅兮昂1 小时前
Cloudflare Tunnel 实践教程
后端