索引的基本概念
在上一节中,你学习了如何对数据库进行增删改查操作。你可能已经发现,随着数据量的增加,查询速度会变慢。这时,索引就派上用场了。
本节将带你了解:
- 什么是索引,为什么需要它
- 索引是如何提高查询性能的
- 常见的索引类型
- 创建索引的基本语法
- 索引的优点与注意事项
无论你使用的是哪种关系型数据库,理解索引的原理都是提升性能的关键。
什么是索引?
索引(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;
索引查询示例
假设你已经为学生表 students
的 name
字段创建了一个索引,这时候执行以下 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
条件、JOIN
、ORDER BY
等操作) - 提高排序性能
- 提高数据唯一性约束的效率
⚠️ 缺点:
- 会占用磁盘空间(每个索引本质上是一份额外的结构)
- 会影响写入性能(插入、更新、删除操作时,索引也要同步维护)
- 过多的索引反而可能导致查询变慢(数据库可能选择了不合适的索引)