MySQL: MySQL索引基础与创建管理

最后更新:2026-08-26

索引是数据库性能优化的关键——没有索引的查询就像翻字典不看目录。

本课讲解索引的原理、创建和管理。

1. 你将学到


2. 真实场景

(1) 痛点:查询太慢

100 万条用户数据,按邮箱查询:

SQL
SELECT * FROM users WHERE email = 'alice@email.com';
-- 执行时间:2.5 秒(全表扫描)

(2) 索引的解法

SQL
CREATE INDEX idx_email ON users(email);
-- 再次查询:0.003 秒(索引查找)
维度 无索引 有索引
查询方式 全表扫描 B+Tree 查找
100 万行查询 2-5 秒 < 0.01 秒
写入性能 无额外开销 略慢(需维护索引)

3. 索引原理

(1) B+Tree 结构

100%
graph TB
    R[Root Node<br/>10 | 30 | 50] --> L1[1-10]
    R --> L2[11-30]
    R --> L3[31-50]
    R --> L4[51+]
    L1 --> D1[Data: 1,3,5,7,9]
    L1 --> D2[Data: 2,4,6,8,10]
    L2 --> D3[Data: 11,15,20]
    L2 --> D4[Data: 25,28,30]
    L3 --> D5[Data: 31,35,40]
    L3 --> D6[Data: 45,48,50]

(2) 索引类型

类型 说明 适用场景
B+Tree 索引 默认索引类型 等值/范围/排序
Hash 索引 哈希表 等值查询(Memory 引擎)
全文索引 文本搜索 文章内容搜索
空间索引 GIS 数据 地理位置查询

4. 创建索引

▶ 示例:创建索引

SQL
-- 方法1:CREATE INDEX
CREATE INDEX idx_email ON users(email);

-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);

-- 方法2:ALTER TABLE
ALTER TABLE users ADD INDEX idx_username (username);

-- 组合索引(联合索引)
CREATE INDEX idx_name_email ON users(username, email);

-- 前缀索引
CREATE INDEX idx_email_prefix ON users(email(10));
▶ 试一试

5. 查看索引

▶ 示例:查看索引信息

SQL
-- 查看表的所有索引
SHOW INDEX FROM users;

-- 查看索引信息
SHOW INDEX FROM users\G
▶ 试一试

输出:

TEXT 📖 仅展示
+-------+------------+----------+--------------+-------------+
| Table | Key_name   | Seq_in_index | Column_name | Index_type |
+-------+------------+--------------+-------------+------------+
| users | PRIMARY    |            1 | id          | BTREE      |
| users | idx_email  |            1 | email       | BTREE      |
+-------+------------+--------------+-------------+------------+

6. 删除索引

▶ 示例:删除索引

SQL
-- 方法1:DROP INDEX
DROP INDEX idx_email ON users;

-- 方法2:ALTER TABLE
ALTER TABLE users DROP INDEX idx_email;

-- 删除主键
ALTER TABLE users DROP PRIMARY KEY;
▶ 试一试

7. 索引适用场景

场景 是否建索引 原因
WHERE 条件字段 加速查询
JOIN 连接字段 加速连接
ORDER BY 字段 避免排序
GROUP BY 字段 加速分组
高选择性字段 区分度高
频繁更新字段 维护成本高
低选择性字段 如性别(M/F)
数据量小的表 全表扫描更快

❓ 常见问题

Q 索引越多越好?
A 不是。索引占用空间,降低写入性能。只在常用查询字段上建索引。
Q 主键自动有索引?
A 是的。PRIMARY KEY 自动创建聚簇索引,UNIQUE 自动创建唯一索引。
Q 如何判断是否需要索引?
A 用 EXPLAIN 分析查询计划,看是否使用了索引。
Q 索引越多越好吗?
A 不是。索引拖慢写入性能,建议单表不超 5-6 个。
Q 主键一定是聚簇索引吗?
A InnoDB 中是的,主键就是聚簇索引。MyISAM 中主键是非聚簇索引。

📖 小节


📝 作业

  1. 基础题(难度⭐):给 users 表的 email 字段创建唯一索引。

  2. 进阶题(难度⭐⭐):创建组合索引 (department, salary),并验证最左前缀原则。

  3. 挑战题(难度⭐⭐⭐):用 EXPLAIN 对比有索引和无索引的查询性能差异。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏