my+MySQL Atlas数据库学习图谱
官方手册 ↗
LEARN BY QUERYING · MYSQL 8.4

让每一条 SQL
都有清晰的答案。

先看证据,再谈优化

从查询形状理解索引,用执行计划验证你的判断。

示例数据查询结果动手练习
ONE DATASET, MANY QUESTIONS

准备你的练习数据 4 位客户 · 5 笔订单

+

在自己的空白练习数据库中执行。每项示例都基于初始数据独立验证;事务课程会改变数据,再次练习时请使用新的空白数据库。金额采用 DECIMAL,表使用 InnoDB。

建表与示例数据
CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(40) NOT NULL,
  nickname VARCHAR(40) NULL
) ENGINE=InnoDB;
CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT NOT NULL,
  amount DECIMAL(10,2) NOT NULL,
  status VARCHAR(20) NOT NULL,
  ordered_at DATE NOT NULL,
  FOREIGN KEY (customer_id) REFERENCES customers(id)
) ENGINE=InnoDB;
INSERT INTO customers VALUES
  (1, 'Ada', 'ada'), (2, 'Linus', NULL),
  (3, 'Grace', 'grace'), (4, 'Guido', NULL);
INSERT INTO orders VALUES
  (1, 1, 120.00, 'paid', '2026-01-02'),
  (2, 1, 80.00, 'paid', '2026-01-05'),
  (3, 2, 200.00, 'pending', '2026-01-06'),
  (4, 2, 50.00, 'paid', '2026-01-07'),
  (5, 3, 150.00, 'paid', '2026-01-09');
下载 dataset.sql ↓
THE PRACTICE

索引与执行计划 03

结果基于统一数据集;计划与锁行为需结合实际环境
01MySQL 8.0 · MySQL 8.4

按查询形状设计联合索引

按客户筛选、按日期读取订单,评估 customer_id 与 ordered_at 的联合索引。

常见做法给每个字段单独建索引,期望优化器总能组合出最佳访问路径。

注意事项

最左前缀是理解索引的起点,优化器也可能选择其他策略。小数据集可能全表扫描;不要依据本例声称已提速。

官方依据 ↗核对于 2026-10-06
SQL
CREATE INDEX idx_customer_date
ON orders(customer_id, ordered_at);
SELECT id, amount
FROM orders
WHERE customer_id = 1 AND ordered_at >= '2026-01-01'
ORDER BY ordered_at, id;

示例结果

idamount
1120.00
280.00

动手练习

仅按 ordered_at 筛选时,这个索引一定有效吗?

查看参考答案 +

不一定。结合选择性与 EXPLAIN 评估;如果日期查询频繁,可测试日期开头的索引。

02MySQL 8.0 · MySQL 8.4

理解覆盖索引

查询只需要 customer_id 和 amount 时,测试包含这两列的索引。

常见做法SELECT * 会索取更多字段,使某些索引无法覆盖查询。

注意事项

覆盖意味着索引含有所需列,不保证一定被选择;索引会增加存储和写入成本。

官方依据 ↗核对于 2026-10-06
SQL
CREATE INDEX idx_customer_amount
ON orders(customer_id, amount);
SELECT amount FROM orders
WHERE customer_id = 1
ORDER BY amount;

示例结果

amount
80.00
120.00

动手练习

增加 status 列后,当前联合索引仍覆盖查询吗?

查看参考答案 +

这个索引没有 status 列,不能据此认为查询仍被覆盖。先看计划,再权衡扩大索引的成本。

03MySQL 8.0 · MySQL 8.4

读懂 EXPLAIN,再测量

使用 JSON 格式查看优化器计划,观察访问方式、候选索引与估算行数。

常见做法只看 SQL 是否简短,或凭索引名称猜测查询性能。

注意事项

估算不是实际耗时。EXPLAIN ANALYZE 会执行查询,应先确认查询影响;计划随数据规模、统计信息和版本变化。

官方依据 ↗核对于 2026-10-06
SQL
EXPLAIN FORMAT=JSON
SELECT id, amount FROM orders
WHERE customer_id = 1;

如何阅读结果

JSON 计划中查看 query_block、访问方式、候选索引与估算行数。本站不固定展示计划:它会随数据、索引、统计信息和版本变化。

动手练习

在足够大的测试数据集上比较有无联合索引的计划。

查看参考答案 +

比较访问路径、估算行数与实际执行指标,并使用相同数据和查询条件。

FROM THE SOURCE

版本与官方更新

自动检查官方发布索引;中文课程由维护者核对更新。