跳到主要内容

索引的基本概念

在上一节中,你学习了如何对数据库进行增删改查操作。你可能已经发现,随着数据量的增加,查询速度会变慢。这时,索引就派上用场了。

本节将带你了解:

  • 什么是索引,为什么需要它
  • 索引是如何提高查询性能的
  • 常见的索引类型
  • 创建索引的基本语法
  • 索引的优点与注意事项

无论你使用的是哪种关系型数据库,理解索引的原理都是提升性能的关键。

什么是索引?

索引(Index)就像是书本的目录

想象一下,如果你在一本 1000 页的字典中查一个词,如果没有目录或页码索引,你只能一页页翻,效率极低;但如果有按字母顺序排列的索引,你可以直接跳到相关页码,快速找到目标。

数据库中的索引也是类似的机制——它是在数据库表的某些列上构建的特殊数据结构,可以加快数据的查找速度。

索引是如何提高查询效率的?

当你执行一个查询语句时,数据库系统会扫描数据表来查找满足条件的行。如果表很大,这种全表扫描(Full table scan)会很慢。

如果你在查询字段上创建了索引,数据库就可以通过索引直接定位目标数据,就像翻书一样直接跳到对应页码,大大减少了扫描的行数

通俗理解

没有索引 = 从头翻书

有了索引 = 看目录跳转页码

常见的索引类型

你可能会接触到不同类型的索引,下面是几种常见类型的简介:

类型简介
普通索引最基本的索引类型,加速查询但不强制唯一性
唯一索引不允许索引列中有重复值,适合用于用户名、邮箱等唯一性字段
主键索引主键自动创建的唯一索引,且不能为空
复合索引在多个列上建立的索引,适合多列联合查询
全文索引用于文本搜索(如 MySQL 中的 FULLTEXT),支持关键词匹配
哈希索引使用哈希算法建立索引,查询速度快,适合等值查询
B+ 树索引目前最主流的索引结构(MySQL 默认就是),查询性能优秀,支持范围查找等

不同数据库系统对这些索引的实现可能略有不同,但核心思想是相通的。

如何创建索引(以 SQL 为例)

你可以使用 CREATE INDEX 或在建表时定义索引字段。

示例 1:创建普通索引

CREATE INDEX idx_name ON students(name);

这条语句会在 students 表的 name 字段上创建一个索引,索引名称为 idx_name

示例 2:创建唯一索引

CREATE UNIQUE INDEX idx_email ON users(email);

确保 users 表中的 email 字段没有重复值。

示例 3:删除索引

DROP INDEX idx_name ON students;

索引查询示例

假设你已经为学生表 studentsname 字段创建了一个索引,这时候执行以下 SQL 查询指令就很有可能会使用刚刚创建的 idx_name 索引。

SELECT * FROM students WHERE name = '张三';

这条语句会让数据库去 name 的索引结构中查找是否存在 '张三',再根据索引指向找到整行数据。

但是如果你使用类似于下面的模糊查询,由于数据库无法使用索引进行“前缀匹配”,因此很可能还是会全表扫描。

SELECT * FROM students WHERE name LIKE '%三';

那如何判断是否用了索引?

你可以使用数据库的 执行计划语法 查看实际查询是否使用了索引。例如:

EXPLAIN SELECT * FROM students WHERE name = '张三';

上述命令执行后会输出一张表,看看 key 字段是否是 idx_name,就知道数据库是否用了索引。

下面是一个完整的演示流程:

-- 创建表
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);

-- 插入一些数据
INSERT INTO students (id, name, age) VALUES
(1, '张三', 20),
(2, '李四', 21),
(3, '王五', 22);

-- 创建索引
CREATE INDEX idx_name ON students(name);

-- 使用查询
SELECT * FROM students WHERE name = '张三';

-- 查看是否使用索引
EXPLAIN SELECT * FROM students WHERE name = '张三';
提示

通常来说,只要你创建了索引,数据库就会尝试自动选择是否使用索引,你不需要手动指定使用哪个索引。这一过程由数据库中的 查询优化器(Query Optimizer) 来完成,它的职责就是判断:

  • 使用哪个索引会更快?
  • 使用全表扫描是否反而更高效?
  • 是否合并多个索引、走覆盖索引、使用排序等等?

💡 也就是说:索引不是强制性的,而是数据库自己决定用不用。你只需要写正常的 SQL 查询语句。

索引的优缺点

✅ 优点:

  • 加快查询速度(特别是 WHERE 条件、JOINORDER BY 等操作)
  • 提高排序性能
  • 提高数据唯一性约束的效率

⚠️ 缺点:

  • 会占用磁盘空间(每个索引本质上是一份额外的结构)
  • 会影响写入性能(插入、更新、删除操作时,索引也要同步维护)
  • 过多的索引反而可能导致查询变慢(数据库可能选择了不合适的索引)

索引的使用建议

  • 常用于 WHERE 条件JOIN 连接字段排序字段分组字段的列适合创建索引。
  • 不要给频繁修改的列盲目加索引,会降低性能。
  • 低基数(重复值很多,比如性别)的列通常不建议加索引,效果不明显。
  • 合理使用复合索引可以避免创建多个索引。

小结

在本节中,你了解了索引的核心知识:

  • 索引就像书的目录,可以加速查询
  • 常见的索引类型有普通索引、唯一索引、主键索引等
  • 使用 SQL 可以方便地创建和删除索引
  • 索引提升查询效率的同时,也带来维护成本

掌握索引的原理和使用技巧,将帮助你打造性能更优的数据库结构。在后续项目开发中,你会发现索引设计是一门“艺术”,值得深入研究。