欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > MySQL 的索引类型有哪些?

MySQL 的索引类型有哪些?

2025/6/19 3:27:40 来源:https://blog.csdn.net/guochuanlin1/article/details/147547212  浏览:    关键词:MySQL 的索引类型有哪些?

MySQL 中的索引是提高查询性能的重要工具,它通过构建数据结构来加速数据检索。MySQL 支持多种索引类型,每种类型适用于不同的场景。以下是 MySQL 中主要的索引类型及其特点:


1. B-Tree 索引(默认类型)

  • 结构:基于平衡多路搜索树(B-Tree),适用于等值查询(=)、范围查询(><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),INDEX USING HASH (name)  -- MEMORY 引擎支持
    ) ENGINE=MEMORY;
    

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

  • 结构:专为文本搜索设计,支持对 CHARVARCHARTEXT 列进行全文检索。
  • 特点
    • 使用倒排索引技术,支持自然语言搜索(MATCH ... AGAINST)、布尔模式搜索等。
    • 仅适用于 MyISAMInnoDB(MySQL 5.6+)。
  • 适用场景:文本内容搜索(如博客文章、商品描述)。
  • 示例
    CREATE FULLTEXT INDEX idx_content ON articles(content);
    SELECT * FROM articles WHERE MATCH(content) AGAINST('MySQL 索引');
    

4. R-Tree 索引(空间索引)

  • 结构:基于多维空间数据(如地理坐标),支持空间数据查询(如 MBRContainsST_Distance)。
  • 特点
    • 仅适用于 MyISAMInnoDB(MySQL 5.7+)。
    • 用于地理信息系统(GIS)或空间数据分析。
  • 适用场景:地理位置查询(如附近商家、区域范围搜索)。
  • 示例
    CREATE SPATIAL INDEX idx_location ON stores(location);  -- location 为 GEOMETRY 类型
    SELECT * FROM stores WHERE MBRContains(GeomFromText('POLYGON(...)'), location);
    

5. 前缀索引(Partial Index)

  • 结构:对字符串列的前 N 个字符创建索引,节省存储空间。
  • 特点
    • 适用于长字符串(如 URL、邮箱),但可能降低选择性(重复值增多)。
    • 需合理选择前缀长度(通过 COUNT(DISTINCT LEFT(col, N)) 评估)。
  • 适用场景:长字符串列的等值查询。
  • 示例
    CREATE INDEX idx_email_prefix ON users(email(10));  -- 对 email 前 10 个字符建索引
    

6. 唯一索引(Unique Index)

  • 结构:强制列值唯一(允许 NULL,但 NULL 值不重复)。
  • 特点
    • 保证数据唯一性,同时可作为普通索引加速查询。
    • 适用于主键(PRIMARY KEY)或唯一约束(UNIQUE KEY)。
  • 适用场景:需要唯一性的字段(如用户名、身份证号)。
  • 示例
    CREATE UNIQUE INDEX idx_username ON users(username);
    -- 或直接定义唯一约束
    ALTER TABLE users ADD CONSTRAINT uk_email UNIQUE (email);
    

7. 主键索引(Primary Key Index)

  • 结构:特殊的唯一索引,不允许 NULL 值,且每张表只能有一个。
  • 特点
    • 在 InnoDB 中,主键索引是聚簇索引(数据按主键顺序存储)。
    • 用于标识行数据,是表的核心索引。
  • 适用场景:表的唯一标识符(如自增 ID、UUID)。
  • 示例
    CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100)
    );
    

8. 复合索引(Multi-Column Index)

  • 结构:在多列上创建的索引,遵循最左前缀原则。
  • 特点
    • 查询需从索引的最左列开始匹配(如 (a,b,c) 索引可加速 aa,ba,b,c 的查询)。
    • 避免“索引失效”问题(如跳过最左列或使用范围查询后无法利用后续列)。
  • 适用场景:多列联合查询(如姓名+年龄筛选)。
  • 示例
    CREATE INDEX idx_name_age ON users(name, age);
    -- 有效查询:
    SELECT * FROM users WHERE name = 'Alice' AND age = 25;
    -- 无效查询(跳过最左列):
    SELECT * FROM users WHERE age = 25;
    

9. 自适应哈希索引(Adaptive Hash Index, AHI)

  • 结构:InnoDB 自动为频繁访问的索引页构建哈希索引,无需手动创建。
  • 特点
    • 仅在内存中维护,适用于等值查询(如 =IN)。
    • 无法手动控制,由 InnoDB 引擎自动管理。
  • 适用场景:高并发等值查询的热点数据。

10. 函数索引(虚拟列索引)

  • 结构:对计算列(如 LOWER(name))创建索引,避免在查询中重复计算。
  • 特点
    • 需 MySQL 5.7+ 或 MariaDB 支持。
    • 适用于表达式查询(如不区分大小写的搜索)。
  • 示例
    ALTER TABLE users ADD COLUMN name_lower VARCHAR(100) AS (LOWER(name)) STORED;
    CREATE INDEX idx_name_lower ON users(name_lower);
    SELECT * FROM users WHERE name_lower = 'alice';
    

索引选择建议

  1. 优先选择 B-Tree 索引:适用于大多数场景(等值、范围、排序)。
  2. 避免过度索引:每个索引会增加写入开销(INSERT/UPDATE/DELETE)。
  3. 利用最左前缀原则:设计复合索引时,将高选择性列放在左侧。
  4. 监控索引使用情况:通过 EXPLAIN 分析查询计划,删除未使用的索引。

总结

索引类型适用场景引擎支持示例
B-Tree全值、范围、排序、分组MyISAM、InnoDBCREATE INDEX idx ON t(col);
Hash等值查询(内存表)MEMORY、InnoDB(AHI)INDEX USING HASH (col)
Full-Text文本搜索MyISAM、InnoDBCREATE FULLTEXT INDEX ...
R-Tree空间数据查询MyISAM、InnoDBCREATE SPATIAL INDEX ...
前缀索引长字符串列的等值查询MyISAM、InnoDBINDEX (col(10))
唯一索引唯一性约束所有引擎CREATE UNIQUE INDEX ...
主键索引表的唯一标识符所有引擎PRIMARY KEY (col)
复合索引多列联合查询MyISAM、InnoDBINDEX (a, b, c)

根据实际查询需求选择合适的索引类型,并通过 EXPLAIN 验证优化效果。

我正在程序员刷题神器面试鸭上高效准备面试,9000+ 高频面试真题、800 万字优质题解,覆盖主流编程方向,跟我一起刷原题、过面试:点击进入

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词