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

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

相关推荐
沙漏无语9 分钟前
Spring Boot集成Spring Statemachine
spring boot·后端·spring
zhuyasen1 小时前
Go错误码规范化指南:构建优雅的HTTP & gRPC错误处理体系
后端·go
小杨4042 小时前
springboot框架项目实践应用七(validation分组、嵌套校验)
spring boot·后端·架构
AskHarries2 小时前
Spring Boot对接twilio发送邮件信息
后端
李长渊哦3 小时前
引入其他 YML 配置源 —— Spring Boot 中的 `import` 功能
数据库·spring boot·后端
高建伟-joe3 小时前
Spring Boot Tomcat 漏洞修复
java·spring boot·后端·网络安全·tomcat
小钊(求职中)3 小时前
RabbitMQ从入门到实战-知识详情总结
java·服务器·spring boot·分布式·spring·面试·rabbitmq
拉不动的猪3 小时前
刷刷题34(uniapp中级实际项目问题-1)
前端·vue.js·面试
uhakadotcom3 小时前
Python 缓存利器:`cachetools`
后端·面试·github
tan180°3 小时前
版本控制器Git(4)
linux·c++·git·后端·vim