📌 目录

  1. MySQL 索引概述
  2. 索引的作用
  3. MySQL 索引类型
    • 单列索引
    • 联合索引
    • 唯一索引
    • 全文索引
    • 空间索引
  4. MySQL 创建索引
  5. MySQL 删除索引
  6. MySQL 查看索引
  7. MySQL 索引优化
  8. 参考资料

MySQL 索引概述

索引(Index) 是数据库中用于加速查询的一种数据结构。它通过为表中的列创建额外的数据结构,使得数据库在查询时能够快速定位所需数据。就像书籍中的目录,索引可以显著提高数据库检索操作的效率。

📌 索引的基本作用

  • 提高查询速度:通过索引,MySQL 可以快速定位到符合条件的记录,而无需扫描整个数据表。
  • 确保数据的唯一性:唯一索引可以确保表中某列(或某几列)的值唯一。
  • 加速排序与分组:索引也能加速 ORDER BYGROUP BY 操作。

索引的作用

  1. 加速查询:索引可以使数据库在查询时,直接通过索引定位到数据行,而不是进行全表扫描。
  2. 加速排序:对于使用 ORDER BY 语句的查询,索引能够提高排序效率。
  3. 加速分组:索引在 GROUP BY 操作中也能提高性能。
  4. 确保数据唯一性:通过唯一索引,可以强制某列的值保持唯一性,避免重复数据。

MySQL 索引类型

1️⃣ 单列索引

单列索引是指基于单个列创建的索引。每个列上的索引都是独立的。

示例:

CREATE INDEX idx_column_name ON table_name (column_name);

2️⃣ 联合索引

联合索引是基于多个列创建的索引。联合索引最常用于多列作为查询条件的情况。

示例:

CREATE INDEX idx_multi_column ON table_name (column1, column2);

📌 注意: 联合索引的列顺序会影响查询的效率。查询条件从左到右依次使用索引列,会获得最佳性能。

3️⃣ 唯一索引

唯一索引确保索引列中的值是唯一的,即同一列中不能有重复的值。

示例:

CREATE UNIQUE INDEX idx_unique_column ON table_name (column_name);

📌 用途: 常用于保证数据的唯一性,如用户名、邮箱等。

4️⃣ 全文索引

全文索引是用于文本搜索的索引类型,允许对文本数据进行高效的全文检索。

示例:

CREATE FULLTEXT INDEX idx_fulltext_column ON table_name (column_name);

📌 适用场景: 适用于文章内容、评论、博客等文本数据的搜索。

5️⃣ 空间索引

空间索引主要用于地理信息系统(GIS)数据,支持空间数据类型,如 POINTLINESTRING 等。

示例:

CREATE SPATIAL INDEX idx_spatial_column ON table_name (column_name);


MySQL 创建索引

1️⃣ 创建单列索引

CREATE INDEX index_name ON table_name (column_name);

📌 示例:

CREATE INDEX idx_name ON employees (name);

该语句会在 employees 表的 name 列上创建一个索引。

2️⃣ 创建联合索引

CREATE INDEX index_name ON table_name (column1, column2);

📌 示例:

CREATE INDEX idx_name_salary ON employees (name, salary);

该语句会在 employees 表的 namesalary 列上创建一个联合索引。

3️⃣ 创建唯一索引

CREATE UNIQUE INDEX index_name ON table_name (column_name);

📌 示例:

CREATE UNIQUE INDEX idx_email ON employees (email);

该语句会为 employees 表的 email 列创建一个唯一索引,确保 email 列中的数据唯一。

4️⃣ 创建全文索引

CREATE FULLTEXT INDEX index_name ON table_name (column_name);

📌 示例:

CREATE FULLTEXT INDEX idx_description ON products (description);

该语句会为 products 表的 description 列创建一个全文索引。

5️⃣ 创建空间索引

CREATE SPATIAL INDEX index_name ON table_name (column_name);

📌 示例:

CREATE SPATIAL INDEX idx_location ON places (location);

该语句会为 places 表的 location 列创建一个空间索引。


MySQL 删除索引

删除索引可以通过 DROP INDEX 语句完成。删除索引时,不会影响表中的数据,只是去除索引结构。

DROP INDEX index_name ON table_name;

📌 示例:

DROP INDEX idx_name ON employees;

该语句会删除 employees 表上的 idx_name 索引。


MySQL 查看索引

使用 SHOW INDEXSHOW KEYS 来查看表的索引。

SHOW INDEX FROM table_name;

📌 示例:

SHOW INDEX FROM employees;

该语句会显示 employees 表上的所有索引。


MySQL 索引优化

1️⃣ 使用索引优化查询

  • 在常用的查询列上添加索引,尤其是 WHERE 子句中经常用到的列。
  • 对于多表连接查询,确保连接条件的列有索引,避免全表扫描。

2️⃣ 合理使用联合索引

  • 创建联合索引时,列的顺序应尽量与查询条件中的顺序一致。最常用的列应排在前面。
  • 注意联合索引并不一定能提高所有查询的性能,只有涉及所有索引列的查询才会使用该索引。

3️⃣ 避免过多的索引

  • 创建索引会占用磁盘空间,并且在数据更新时(如 INSERTUPDATEDELETE)会降低性能。
  • 在不频繁使用的查询列上不必创建索引,避免浪费系统资源。

4️⃣ 使用 EXPLAIN 分析查询

  • 使用 EXPLAIN 语句分析查询计划,确保查询能够利用索引进行优化。
EXPLAIN SELECT * FROM employees WHERE name = 'John';


参考资料


通过合理使用索引,可以显著提高数据库查询的性能,但在实际应用中要谨慎选择索引类型和管理方式。如果有任何进一步的问题或优化需求,欢迎继续交流!