20260705MySQL作业题

MySQL 8 索引与 EXPLAIN 基础作业题
目标:掌握 PRIMARY KEY、UNIQUE INDEX、INDEX(普通索引)的创建、删除与查看,以及 EXPLAIN 的基本使用。
一、环境准备
请先执行以下 SQL 语句,创建练习用的数据库和数据表:
-- 1. 创建练习数据库CREATE DATABASE IF NOT EXISTS school_db DEFAULT CHARSET utf8mb4;USE school_db;
-- 2. 创建学生表(无任何索引,仅主键)CREATE TABLE student ( id INT NOT NULL, name VARCHAR(50), id_card VARCHAR(18), age INT, email VARCHAR(100)) ENGINE = InnoDB;
-- 3. 插入测试数据INSERT INTO student (id, name, id_card, age, email) VALUES(1, '张三', '330101200001011234', 25, 'zhangsan@example.com'),(2, '李四', '330102200102022345', 22, 'lisi@example.com'),(3, '王五', '330103200203033456', 23, 'wangwu@example.com'),(4, '赵六', '330104200304044567', 24, 'zhaoliu@example.com'),(5, '孙七', '330105200405055678', 25, 'sunqi@example.com'),(6, '周八', '330106200506066789', 22, 'zhouba@example.com'),(7, '吴九', '330107200607077890', 23, 'wujiu@example.com'),(8, '郑十', '330108200708088901', 24, 'zhengshi@example.com'),(9, '钱十一', '330109200809099012', 25, 'qian11@example.com'),(10, '陈十二', '330110200910100123', 22, 'chen12@example.com');二、索引操作练习题
📌 题目 1:创建 PRIMARY KEY(主键索引)
需求:将 student 表的 id 字段设置为主键。
提示:主键索引是唯一的、不能为 NULL,每个表只能有一个主键。
alter table student add primary key (id);
alter table student modify column id int unsigned auto_increment;
alter table student auto_increment = 10;📌 题目 2:创建 UNIQUE INDEX(唯一索引)
需求:为 student 表的 id_card(身份证号)字段创建唯一索引,确保身份证号不重复。
提示:唯一索引允许为空值,但非空值必须唯一。
# 创建方式一:alter table student add unique index uk_id_card (id_card);
# 创建方式二: 注意这个是有on关键字的create unique index uk_id_card on student (id);# 额外: 联合索引,两个索引使用同一个名字create unique index uk_id_card on student (id, name);📌 题目 3:创建普通 INDEX(普通索引)
需求:为 student 表的 name 字段创建普通索引,加速按姓名查询。
提示:普通索引没有任何约束,仅用于加速查询。
alter table student add index idx_name (name);📌 题目 4:再创建一个普通索引
需求:为 student 表的 age 字段创建普通索引。
alter table student add index idx_age (age);📌 题目 5:查看表中的索引
需求:查看 student 表现在所有的索引信息。
提示:MySQL 中查看索引的关键字是 SHOW INDEX。
show indexes from student;# 或show index from student;💡 说明:执行后你会看到 4 个索引:
索引名 类型 字段 PRIMARY PRIMARY KEY id idx_student_id_card UNIQUE id_card idx_student_name INDEX(普通) name idx_student_age INDEX(普通) age
📌 题目 6:删除普通索引
需求:删除 student 表上 age 字段的普通索引。
提示:删除索引使用 DROP INDEX。
# 删除方式一alter table student drop index idx_age;# 删除方式二: 注意这个带有on关键字drop index idx_age on student;📌 题目 7:删除唯一索引
需求:删除 student 表上 id_card 字段的唯一索引。
alter table student drop index uk_id_card;📌 题目 8:删除主键索引
需求:删除 student 表的主键索引。
提示:删除主键使用 DROP PRIMARY KEY,注意主键如果有自增属性需要先删除自增。
alter table student drop index `PRIMARY`;三、EXPLAIN 练习题
📌 题目 9:EXPLAIN 基础 —— 全表扫描
需求:对 student 表执行一次全表查询,并用 EXPLAIN 查看执行计划。
# 前提: id无主键无索引,按id查询时,type=ALLexplain select *from studentwhere id > 1;
# 为什么使用了limit3后,仍然会全表扫描?# 原因在于 MySQL无法确认有多少条 id = 10的记录,只能把所有行扫完.explainselect *from studentwhere id = 10order by idlimit 10;
# explain = desc = describedescselect *from studentorder by id asclimit 3;💡 关键观察:
type列的值为ALL,表示全表扫描(没有使用任何索引)。
📌 题目 10:EXPLAIN —— 主键查询
需求:先为 student 表重新添加主键,然后执行按主键查询,并用 EXPLAIN 查看执行计划。
# 添加主键alter table student add primary key (id);# 按主键查询,显示type=constexplainselect *from studentwhere id = 1;💡 关键观察:
type列的值为const,表示通过主键精确匹配,效率最高。
📌 题目 11:EXPLAIN —— 普通索引查询
需求:为 name 字段创建普通索引后,执行按姓名查询,并用 EXPLAIN 查看执行计划。
# 对name创建普通索引alter table student add index idx_name (name);# 按name查询,显示type=ref,这代表了使用了普通索引explainselect *from studentwhere name = '张三';💡 关键观察:
type列的值通常为ref,表示使用了普通索引进行匹配。
📌 题目 12:EXPLAIN —— 无索引查询对比
需求:删除 name 字段的索引后,再次执行按姓名查询,对比 EXPLAIN 的结果。
# 对name删除普通索引alter table student drop index idx_name ;# 按name查询,显示type=ALL,这代表了使用了普通索引explainselect *from studentwhere name = '张三';💡 关键观察:
type列变回ALL(全表扫描),说明没有索引可用,MySQL 必须逐行查找。
四、综合练习
📌 题目 13:综合操作
请按以下顺序完成操作,每一步都用 SHOW INDEX 验证结果:
- 为
email字段创建唯一索引 - 为
age字段创建普通索引 - 查看当前所有索引
- 删除
age字段的普通索引 - 再次查看所有索引
show index from student;# 1. 为email字段创建唯一索引alter table student add unique index uk_email (email);# 2. 为age字段创建普通索引alter table student add index idx_age (age);show index from student;# 4. 删除age字段的普通索引alter table student drop index idx_age;show index from student;五、知识点速查表
| 操作 | 命令模板 |
|---|---|
| 添加主键 | ALTER TABLE 表名 ADD PRIMARY KEY (字段); |
| 添加唯一索引 | CREATE UNIQUE INDEX 索引名 ON 表名(字段); |
| 添加普通索引 | CREATE INDEX 索引名 ON 表名(字段); |
| 删除索引 | DROP INDEX 索引名 ON 表名; |
| 删除主键 | ALTER TABLE 表名 DROP PRIMARY KEY; |
| 查看索引 | SHOW INDEX FROM 表名; |
| 查看执行计划 | EXPLAIN SQL语句; |
EXPLAIN 常用字段说明
| 字段 | 含义 |
|---|---|
id | 查询序列号 |
select_type | 查询类型(SIMPLE、PRIMARY 等) |
table | 访问的表 |
type | 访问类型:const > ref > range > index > ALL(性能从左到右递减) |
key | 实际使用的索引 |
rows | 预估扫描行数 |
Extra | 额外信息(如 Using index、Using where 等) |
📖 练习建议:建议在本地 MySQL 8 环境中逐题执行,观察每一步的结果变化,加深理解。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!





















