首页 >> 基础教程

mysql索引分类

      MySQL索引可以从数据结构物理存储逻辑功能三个维度进行分类。以下是详细的分类说明:

一、按数据结构分类(核心分类)

  1. B+Tree索引

    1. 适用引擎:InnoDB、MyISAM(默认索引类型)

    2. 特点

      1. 多路平衡搜索树,支持高效的范围查询(><BETWEEN)和排序(ORDER BY)。

      2. 所有数据存储在叶子节点,非叶子节点只存键值(减少I/O)。

      3. 叶子节点通过指针形成链表,便于顺序扫描。

    3. CREATE INDEX idx_name ON users(name);
  2. Hash索引

    1. 适用引擎:Memory引擎(InnoDB支持自适应哈希索引,但用户无法显式创建)。

    2. 特点

      1. 基于哈希表实现,仅支持精确等值查询=IN)。

      2. 不支持范围查询或排序(哈希值无序)。

      3. 查询复杂度接近O(1),但哈希冲突会影响性能。

    3. CREATE TABLE memory_table (...) ENGINE=MEMORY;
  3. Full-Text索引(全文索引)

    1. 适用引擎:InnoDB(≥5.6)、MyISAM

    2. 特点

      1. 用于全文搜索(MATCH AGAINST),支持关键词检索。

      2. 底层使用倒排索引(Inverted Index)结构。

    3. CREATE FULLTEXT INDEX idx_content ON articles(content);
  4. R-Tree索引(空间索引)

    1. 适用引擎:MyISAM(InnoDB≥5.7支持)

    2. 特点

      1. 用于地理空间数据(GEOMETRY类型),支持GIS查询(如ST_Contains())。

    3. CREATE SPATIAL INDEX idx_location ON maps(coordinates);

二、按物理存储分类(InnoDB特有)

  1. 聚簇索引(Clustered Index)

    1. 特点

      1. 数据行物理存储顺序与索引键值顺序一致(索引即数据文件)。

      2. 一个表只能有一个聚簇索引(通常为主键)。

      3. 范围查询效率高(相邻数据物理连续)。

    2. 生成规则

      1. 若定义了主键,则主键为聚簇索引。

      2. 若无主键,则选第一个UNIQUE NOT NULL列。

      3. 两者皆无,则隐式生成6字节ROWID作为聚簇索引

  2. 非聚簇索引(Secondary Index / 辅助索引)

    1. 特点

      1. 索引节点仅存储索引列值 + 主键值(非数据行物理地址)。

      2. 查询非索引列时需回表(通过主键值到聚簇索引中查找数据)。

三、按逻辑功能分类

  1. 主键索引(PRIMARY KEY)

    1. 特点

      1. 唯一且非空,表只能有一个主键索引(即聚簇索引)。

      2. 自动创建聚簇索引(InnoDB)。

    2. ALTER TABLE users ADD PRIMARY KEY (id);
  2. 唯一索引(UNIQUE)

    1. 特点

      1. 索引列值必须唯一(允许NULL,但NULL可重复)。

      2. 避免数据重复,非聚簇索引(除非被用作聚簇索引)。

    2. CREATE UNIQUE INDEX idx_email ON users(email);
  3. 普通索引(INDEX / KEY)

    1. 特点

      1. 无唯一性约束,仅加速查询。

      2. 最基础的B+Tree索引类型。

    2. CREATE INDEX idx_age ON users(age);
  4. 联合索引(Composite Index)

    1. 特点

      1. 基于多个列创建的索引(最多16列)。

      2. 遵循最左前缀原则(查询条件需包含最左列)。

    2. CREATE INDEX idx_name_age ON users(name, age);
      -- 有效查询: WHERE name='Alice' / WHERE name='Alice' AND age=30
      -- 无效查询: WHERE age=30(跳过最左列name)
  5. 前缀索引(Prefix Index)

    1. 特点

      1. 对文本列前N个字符创建索引(节约空间)。

      2. 牺牲部分选择性(可能增加冲突)。

    2. CREATE INDEX idx_city_prefix ON users(city(10)); 
      -- 仅索引前10字

四、其他特殊索引

  1. 覆盖索引(Covering Index)

    1. 逻辑概念:索引包含查询所需的所有列,避免回表。

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

    1. InnoDB自动创建:对频繁访问的索引页动态构建哈希索引(加速等值查询)。



最新文章
mysql分页问题2025-08-04
千万数据先insert和先建索引哪个快2025-08-04
MySQL 中大小表关联查询如何优化2025-08-04
sql技巧-每个班年龄排前两名的人2025-08-03
MySQL 导致 cpu 飙升的话,要怎么处理呢?2025-07-29
MySQL 中为千万级大表添加字段2025-07-29
mysql中百万级别以上的数据如何删除2025-07-29
分库分表带来的问题2025-07-29
mysql中常用的分库分表中间件有哪些2025-07-29
mysql不停机扩容2025-07-29
备案号:蜀ICP备2023042032号-1