MySQL 的索引类型有哪些?

MySQL 的索引类型及其区别

索引(Index)是 MySQL 提高查询速度的关键机制,它类似于书籍的目录,可以加速数据的查找和排序。

在 MySQL 中,索引有不同的类型,根据数据结构、存储方式和功能进行分类。


1. 按照数据结构分类

索引类型说明适用存储引擎
B+树索引(B-Tree Index)默认索引,适用于大部分查询InnoDB, MyISAM
哈希索引(Hash Index)仅支持等值查询,不支持范围查询Memory
全文索引(Fulltext Index)适用于全文搜索(文本查询)MyISAM, InnoDB(MySQL 5.6+)
R-Tree(空间索引)适用于地理位置(GIS)查询MyISAM

2. 按照索引功能分类

索引类型说明适用场景
主键索引(Primary Key Index)只能有一个,唯一且不能为空唯一标识数据行
唯一索引(Unique Index)约束列值唯一,允许 NULL确保数据不重复
普通索引(Index)普通加速查询的索引频繁查询的列
复合索引(Composite Index)多列联合索引,按左前缀法则匹配组合查询
覆盖索引(Covering Index)索引列包含所有查询字段,避免回表提高查询速度
前缀索引(Prefix Index)长文本字段取前 N 个字符建立索引适用于 TEXTVARCHAR
空间索引(Spatial Index)用于地理数据(GIS)查询POINTPOLYGON 类型
全文索引(Fulltext Index)用于全文搜索适用于大文本字段

3. 各种索引的详细介绍

(1)B+ 树索引(B-Tree Index)

  • 结构:基于 B+ 树 组织,所有索引数据都存储在叶子节点
  • 特点
    • 适用于范围查询(BETWEEN、>、<)和排序(ORDER BY)
    • 支持模糊匹配 LIKE 'abc%'(前缀匹配)
    • 不支持 LIKE '%abc'(后缀匹配)
  • 适用存储引擎:InnoDB、MyISAM(默认索引)

示例:

CREATE INDEX idx_name ON employees(name);

适用查询:

SELECT * FROM employees WHERE name = 'Alice';  -- 精确查询
SELECT * FROM employees WHERE name LIKE 'Al%'; -- 前缀查询

(2)哈希索引(Hash Index)

  • 结构:基于哈希表(Key-Value 映射)。
  • 特点
    • 仅支持等值查询(=),不支持范围查询(BETWEEN、ORDER BY)
    • 速度比 B+ 树索引快,但不适合排序和模糊匹配。
  • 适用存储引擎Memory

示例:

CREATE TABLE cache (
    id INT PRIMARY KEY,
    value VARCHAR(255)
) ENGINE=MEMORY;

适用查询:

SELECT * FROM cache WHERE id = 10;  -- 适用于等值查询

不适用于:

SELECT * FROM cache WHERE id > 10;  -- ❌ 无法使用哈希索引

(3)全文索引(Fulltext Index)

  • 适用于:全文搜索,如 搜索引擎、新闻、博客等文本查询
  • 支持存储引擎
    • MyISAM(MySQL 5.5+)
    • InnoDB(MySQL 5.6+)

示例:

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    FULLTEXT(title, content)
) ENGINE=InnoDB;

适用查询(使用 MATCH ... AGAINST):

SELECT * FROM articles WHERE MATCH(title, content) AGAINST('MySQL 索引');

(4)主键索引(Primary Key Index)

  • 特点
    • 不能为空(NOT NULL
    • 只能有一个主键索引
    • InnoDB 存储引擎使用 B+树 聚簇索引(Clustered Index)
  • 适用场景:唯一标识数据行,如 id 字段

示例:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) ENGINE=InnoDB;

(5)唯一索引(Unique Index)

  • 特点
    • 保证字段的值唯一,但允许 NULL(多个 NULL 值不冲突)
  • 适用场景:邮箱、用户名等字段

示例:

CREATE UNIQUE INDEX idx_email ON users(email);

(6)普通索引(Index)

  • 特点
    • 仅用于加速查询,没有唯一性约束
  • 适用场景
    • 经常被 WHERE 查询的列

示例:

CREATE INDEX idx_name ON employees(name);

(7)复合索引(Composite Index)

  • 特点
    • 多列联合索引,遵循“最左前缀原则”
  • 适用场景
    • 查询涉及多个列,如 (name, age)

示例:

CREATE INDEX idx_name_age ON employees(name, age);

查询优化:

SELECT * FROM employees WHERE name = 'Alice';  -- ✅ 可用索引
SELECT * FROM employees WHERE name = 'Alice' AND age = 30; -- ✅ 可用索引
SELECT * FROM employees WHERE age = 30;  -- ❌ 无法使用索引

(8)覆盖索引(Covering Index)

  • 特点
    • 查询列全部包含在索引中,避免回表查询
  • 适用场景
    • SELECT 查询只需要读取索引列,无需读取数据行

示例:

CREATE INDEX idx_name_age ON employees(name, age);
SELECT name, age FROM employees WHERE name = 'Alice'; -- 覆盖索引

(9)前缀索引(Prefix Index)

  • 特点
    • 适用于 TEXTVARCHAR 长字段
    • 索引前 N 个字符,节省索引空间
  • 适用场景
    • 大文本字段索引,如 email

示例:

CREATE INDEX idx_email ON users(email(10));

总结

索引类型适用查询适用存储引擎
B+ 树索引范围查询、排序、LIKE 'abc%'InnoDB, MyISAM
哈希索引等值查询 =Memory
全文索引文本搜索InnoDB, MyISAM
主键索引唯一标识InnoDB
唯一索引唯一约束InnoDB, MyISAM
复合索引多字段查询InnoDB, MyISAM
前缀索引长字符串查询InnoDB, MyISAM

在实际开发中,合理选择索引类型可以显著提升查询性能 🚀!

### MySQL索引类型及创建方法 #### 1. 普通索引 这是最基本的索引类型,没有任何约束条件。 ```sql CREATE INDEX index_name ON table_name(column_list); ``` 或者,在表结构定义时直接指定: ```sql ALTER TABLE table_name ADD INDEX index_name (column_list);[^2] ``` #### 2. 唯一性索引 唯一性索引要求字段上的值必须是唯一的,允许有空值。如果指定了多个列,则组合后的值必须唯一。 ```sql CREATE UNIQUE INDEX index_name ON table_name(column_list); -- 或者在建表的时候添加 CREATE TABLE table_name ( column_definitions, CONSTRAINT constraint_name UNIQUE (column_list) ); ``` #### 3. 主键索引 主键是一种特殊的唯一索引,不允许存在NULL值,并且一张表只能有一个主键。 ```sql ALTER TABLE table_name ADD PRIMARY KEY (column_list); -- 创建新表并设置主键 CREATE TABLE table_name ( id INT NOT NULL AUTO_INCREMENT, other_columns, PRIMARY KEY(id) ); ``` #### 4. 全文索引 用于全文检索,仅适用于`TEXT`, `CHAR` 和 `VARCHAR` 类型的列。MyISAM存储引擎支持此功能。 ```sql CREATE FULLTEXT INDEX ft_index_name ON table_name(text_column); ``` 需要注意的是,InnoDB自MySQL 5.6版本起也开始支持全文索引[^3]。 #### 5. 组合索引 当需要对多列建立索引时可以考虑使用复合索引,即在一个索引里包含两个以上的字段。 ```sql CREATE INDEX multi_col_idx ON table_name(colA, colB,...); ``` 对于上述每种类型索引,具体的应用场景取决于实际需求以及性能考量因素。例如,全文索引适合处理大量文本数据的快速查找;而普通索引则更常用于提高简单查询的速度等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值