MySQL索引的种类

本文详细介绍了MySQL中各种类型的索引,包括普通索引、唯一索引、主键索引、全文索引、聚簇索引和非聚簇索引,以及单列索引和组合索引的特点与使用。强调了根据查询需求选择合适索引的重要性。

MySQL索引的种类

索引的种类
  • 1、概述

  • 2、索引种类

  • 2.1、逻辑功能划分

  • 2.1.1、普通索引

  • 2.1.2、唯一索引

  • 2.1.3、主键索引

  • 2.1.4、全文索引

  • 2.2、物理实现上划分

  • 2.2.1、聚簇索引

  • 2.2.2、非聚簇索引

  • 2.2.3、聚簇索引与非聚簇索引区别

  • 2.3、作用字段个数划分

  • 2.3.1、单列索引

  • 2.3.2、组合索引

  • 3、总结

1、概述

今天要介绍的内容是索引的种类。
MySQL索引是一种提高查询效率的重要手段,它能够快速定位需要的数据,从而减少查询的开销。MySQL支持多种索引类型,每种类型都有其特点和适用场景。本文将介绍MySQL常见的索引类型及其特点。

2、索引种类

MySQL常见的索引种类有普通索引、唯一索引、全文索引、单列索引、多列索引和空间索引等。索引可以从不同角度去划分,一般来说主要有以下三个划分角度:

lps5c55p.png

2.1、逻辑功能划分

2.1.1、普通索引

普通索引是 MySQL 中最基本的索引类型之一,它可以加快对表中数据的查询速度,并且它只是用于提高查询效率。下面是在user表中创建普通索引的例子:
user表结构

CREATE TABLE users (
  id INT(11) NOT NULL AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  email VARCHAR(100) NOT NULL,
  password VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

可以为 “username” 和 “email” 列创建普通索引,以提高对这两列的查询速度。下面是创建普通索引的例子:

ALTER TABLE users ADD INDEX idx_username (username);
ALTER TABLE users ADD INDEX idx_email (email);

这将为 “username” 和 “email” 列创建名为 “idx_username” 和 “idx_email” 的普通索引。创建普通索引后,我们可以在查询时使用这些索引来加快查询速度。例如:

SELECT * FROM users WHERE username = 'john';
2.1.2、唯一索引

使用unique参数可以设置为唯一索引,创建唯一索引后,相应列的值在全表必须是唯一的,可以为空。
还有user表为例,可以为 user表的"username" 和 “email” 列创建唯一索引,以确保这两列中的每个值都是唯一的。下面是创建唯一索引的示例:

ALTER TABLE users ADD UNIQUE INDEX idx_username (username);
ALTER TABLE users ADD UNIQUE INDEX idx_email (email);

这将为 “username” 和 “email” 列创建名为 “idx_username” 和 “idx_email” 的唯一索引。创建唯一索引后,如果尝试插入重复的值,则会引发错误,这可以帮助确保表中的数据是唯一的。

2.1.3、主键索引

主键索引是 MySQL 中的一种特殊的索引类型,它是用于标识每个表中唯一行的索引。主键索引要求主键列中的每个值都必须唯一且不能为空值。
还以user表为例,其表结构如下:

CREATE TABLE users (
  id INT(11) NOT NULL AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  email VARCHAR(100) NOT NULL,
  password VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

在这个例子中id列被指定为主键列,并且使用了auto_increment属性来自动为每个新行生产唯一的id值。因此,id列中的每个值都是唯一的,且不能为空值。通过将id列指定为主键列,MySQL将自动为该列创建主键索引。这将确保id类中的每个值都是唯一的,并且可以在查询时更快地定位和访问所需的数据。需要注意的是,每个表只能有一个主键,因此,在为表创建主键索引时,需要选择一个唯一的列作为主键列。

2.1.4、全文索引

全文索引是MySQL中的一种特殊索引类型,用于对文本字段进行全文搜索,全文索引可以帮助加快对文本数据的搜索速度,并支持全文搜索的高级功能,例如模糊搜索和关键词匹配。下面是一个创建全文索引的示例:

CREATE TABLE articles (
  id INT(11) NOT NULL AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  content TEXT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

可以为 “content” 列创建全文索引,以便在文章内容中进行全文搜索。下面是创建全文索引的示例:

ALTER TABLE articles ADD FULLTEXT INDEX idx_content (content) WITH PARSER ngram;

注意,上面创建全文索引时我们指定了使用名为“ngram”的分词器来为content列创建全文索引。假设表内有如下的数据:

lps4p7wc.png

当我们使用两个关键字进行查询时,可以查询记录:

mysql> select * from articles where match (content) against('不认');
+----+-------+------+-+
| id | title | content                  | created_at          |
+----+-------+------+-+
|  2 | 1     | 中文搜索,不认知         | 2023-07-14 14:49:24 |
+----+-------+------+-+
1 row in set (0.00 sec)

但是如果使用的关键词只有一个字,则查不出任何记录:

mysql> select * from articles where match (content) against('不');
Empty set (0.00 sec)

这是因为MySQL中ngram_token_size变量的值默认为2,即要查询的词的最少个数为2,如果用一个词去查询自然查不到任何内容。如果要搜索单字,就要把ngram_token_size设置为1。在 MySQL 中,ngram_token_size 是一个全文索引配置选项,用于指定 ngram 索引中单个词语的长度。ngram 索引是一种全文索引算法,它将文本分成连续的 n 个字母或单词,以便更高效地进行搜索。ngram_token_size 决定了 ngram 索引中单个词语的长度,从而影响了全文索引的性能和搜索结果。
使用中文分词器时,需要确保MySQL的字符集设置与文本的字符集匹配,以确保正确的分词和搜索。此外,中文分词器的性能可能会受到一些限制,因此在使用中文分词器时,需要进行适当的性能测试。

然而遗憾的是,在ElasticSearch等专门搜索引擎面前,关系型数据库的全文检索功能使用的并不多。

2.2、物理实现上划分

2.2.1、聚簇索引

在 MySQL 中,聚簇索引是一种特殊的索引类型,它将表中的数据按照索引键的顺序存储在磁盘上,以提高数据访问的效率。聚簇索引的特点是,索引和数据存储在一起,因此在查询时可以直接访问数据而无需再次查找磁盘上的数据块。

2.2.2、非聚簇索引

非聚簇索引是一种索引类型,它将索引和数据分开存储在磁盘上。与聚簇索引不同,非聚簇索引将索引和数据存储在不同的位置,因此在查询时需要先访问索引,再根据索引中的指针访问磁盘上的数据块,从而增加了查询的开销。非聚簇索引常见的类型有 B-tree 索引、哈希索引和全文索引等。
B-tree 索引是一种常见的非聚簇索引类型,它将索引键和指向数据的指针存储在一棵平衡树中。B-tree 索引的特点是支持快速的范围查询和排序操作,因此常用于对范围较大的列进行索引,例如日期、价格等。
哈希索引是另一种常见的非聚簇索引类型,它将索引键通过哈希函数计算出一个唯一的哈希值,并将哈希值和指向数据的指针存储在哈希表中。哈希索引的特点是支持快速的等值查询,但不支持范围查询和排序操作。
全文索引是一种特殊的非聚簇索引类型,它可以对文本内容进行索引和搜索。全文索引的特点是支持对文本内容进行快速的关键字搜索和匹配,因此常用于搜索引擎和文本处理应用中。
需要注意的是,非聚簇索引通常需要占用更多的磁盘空间,因为需要存储索引和指向数据的指针。同时,非聚簇索引的查询效率可能会受到磁盘 I/O 速度的限制,因此需要仔细评估其适用性和性能,以选择最合适的索引类型。

2.2.3、聚簇索引与非聚簇索引区别

聚簇索引和非聚簇索引的区别主要有以下几个:

聚簇索引叶子节点存储的是行数据;而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)。
聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,因此性能不如聚簇索引。
聚簇索引一般为主键索引,而主键一个表中只能有一个,因此聚簇索引一个表中也只能有一个,而非聚簇索引则没有数量上的限制。

2.3、作用字段个数划分

2.3.1、单列索引

单列索引是一种索引类型,它只包含一个列的值,如我们在上面创建的普通索引就是单列索引。

2.3.2、组合索引

组合索引是一种索引类型,它包含多个列的值。与单列索引不同,组合索引将多个列的值组合在一起作为索引键,以提高多列查询的效率。组合索引可以根据多个列的值来快速定位需要的数据,从而减少查询的开销。下面是一个组合索引的示例:
假设有一个名为 “users” 的表,表结构如下:

CREATE TABLE users (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  age INT(11) NOT NULL,
  gender VARCHAR(10) NOT NULL,
  PRIMARY KEY (id),
  INDEX age_gender_index (age, gender)
) ENGINE=InnoDB;

在这个表中,id 列是主键,因此自动创建了一个聚簇索引。同时,我们手动创建了一个名为 “age_gender_index” 的组合索引,以提高根据年龄和性别查询的效率。例如,查询年龄等于 30 且性别为男的用户记录:

SELECT * FROM users WHERE age = 30 AND gender = 'male';

MySQL 将使用 “age_gender_index” 索引来快速定位符合条件的用户记录,而无需扫描整个表。这样可以大大提高查询效率,尤其是在数据量较大时。

需要注意的是,组合索引的顺序很重要,因为索引键的顺序影响查询效率。在上面的例子中,我们将 age 列放在前面,因为根据年龄查询的条件更加常见。此外,组合索引的列数也需要仔细考虑,过多的列可能会降低索引的效率。因此,需要仔细评估索引的适用性和性能,以选择最合适的索引类型和索引键的顺序。

3、总结

MySQL支持多种索引类型,每种类型都有其特点和适用场景。在使用索引时,需要根据查询的特点和数据的结构来选择合适的索引类型和索引键的顺序,以提高查询效率和减少查询的开销。

ps:不够全面,这个详细些 MySQL 索引

<think>嗯,用户想了解MySQL索引的分类,这个问题在数据库优化中很关键。参考提供的资料,需要整合不同引用中的观点,特别要注意引用[2]提到的"逻辑分类"概念。 首先看引用[1]的数据结构分类法,这是最基础的分类维度:B+树索引、哈希索引、全文索引。这个分类清晰但不够全面,比如没提到空间索引。引用[3]提到组合索引和单列索引的效率差异,这其实引出了另一个重要分类维度——字段数量。 用户可能真正需要的是多维度分类体系。根据知识储备,应该从四个层面展开:数据结构、存储方式、字段特性、功能约束。其中全文索引要特别说明版本差异(如引用[1]提到的5.6.4支持),组合索引要强调最左匹配原则(引用[3]的案例正好说明这点)。 注意到引用[2]的重要观点——有些索引类型只是逻辑区分。这意味着需要帮用户辨别物理存在的索引和逻辑概念,比如前缀索引本质还是B+树。在回答时要避免让用户产生"这么多类型需要逐个创建"的误解,可以补充示例说明如何选择索引类型。 用户可能是开发人员或DBA,应该提供实践指导。比如组合索引的创建顺序建议(引用[3]的username+city+age案例),以及何时使用哈希索引。考虑到用户后续可能追问优化问题,在相关问题里预设了索引失效场景的题目。 </think>根据MySQL的实现机制和常见术语体系,索引分类可从以下四个维度系统阐述(附典型示例): ### 一、按数据结构分类(核心物理实现) 1. **B+树索引**(默认索引类型) ```sql CREATE INDEX idx_name ON users(name); -- 创建B+树索引 ``` - ✅ 支持范围查询(`>`、`<`、`BETWEEN`) - ✅ 支持排序(`ORDER BY`) - 💡 适用场景:`WHERE age > 18 AND status = 1` [^1][^3] 2. **哈希索引** ```sql CREATE TABLE test (id INT, UNIQUE INDEX USING HASH (id)) ENGINE=MEMORY; ``` - ⚠️ 仅Memory引擎支持(InnoDB有自适应哈希,但不可创建) - ❌ 不支持范围查询 - 💡 适用场景:等值查询(`WHERE id = 100`)[^1] 3. **全文索引**(FULLTEXT) ```sql ALTER TABLE articles ADD FULLTEXT(title,content); ``` - ✅ 支持关键词搜索(`MATCH...AGAINST`) - 📌 MySQL 5.6.4+ InnoDB开始支持[^1] ### 二、按存储方式分类 1. **聚簇索引**(Clustered Index) - ⭐ InnoDB主键索引 - 📊 叶节点直接存储行数据 (主键查询无需回表) 2. **非聚簇索引**(Secondary Index) - 🔍 叶节点存储主键值 ```sql CREATE INDEX idx_email ON users(email); -- 二级索引 ``` - ️ 回表查询:通过email查其他字段需二次查找[^3] ### 三、按字段特性分类 | 类型 | 示例 | 特点 | |------------------|-------------------------------|--------------------------| | **单列索引** | `INDEX (last_name)` | 单个字段 | | **组合索引** | `INDEX (last_name, first_name)`| 最左匹配原则 ⭐ | | **前缀索引** | `INDEX (url(20))` | 对文本前N字符建立索引 | | **空间索引** | `SPATIAL INDEX (location)` | 仅MyISAM(GIS数据) | > 📌 **组合索引使用要点**: > 有效:`WHERE last_name='Smith' AND first_name='John'` > 无效:`WHERE first_name='John'` (违反最左原则)[^3] ### 四、按功能约束分类 1. **主键索引**(PRIMARY KEY) - ️ 隐含`NOT NULL + UNIQUE` 2. **唯一索引**(UNIQUE) - 🔐 强制列值唯一性 ```sql CREATE UNIQUE INDEX uid_idx ON users(uid); ``` 3. **普通索引**(INDEX/KEY) - 📌 无约束的纯加速索引 ### 常见误区澄清 1. **不存在单独的"全文索引引擎"**:全文索引索引类型,非存储引擎[^2] 2. **哈希索引≠自适应哈希**:用户可创建哈希索引仅限Memory引擎,InnoDB自适应哈希为内部机制[^1] --- ### 相关问题 1. **组合索引的最左匹配原则如何影响查询性能?**[^3] 2. 什么场景下使用前缀索引比完整字段索引更高效? 3. InnoDB的自适应哈希索引与用户创建的哈希索引有何本质区别?[^1] 4. 为什么唯一索引无法完全替代主键索引的功能? > 注:索引选择需结合查询模式、数据分布及存储引擎特性综合判断,避免教条化分类应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值