20260705MySQL作业题

1566 字
8 分钟
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 个索引:

索引名类型字段
PRIMARYPRIMARY KEYid
idx_student_id_cardUNIQUEid_card
idx_student_nameINDEX(普通)name
idx_student_ageINDEX(普通)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=ALL
explain select *
from student
where id > 1;
# 为什么使用了limit3后,仍然会全表扫描?
# 原因在于 MySQL无法确认有多少条 id = 10的记录,只能把所有行扫完.
explain
select *
from student
where id = 10
order by id
limit 10;
# explain = desc = describe
desc
select *
from student
order by id asc
limit 3;

💡 关键观察type 列的值为 ALL,表示全表扫描(没有使用任何索引)。


📌 题目 10:EXPLAIN —— 主键查询#

需求:先为 student 表重新添加主键,然后执行按主键查询,并用 EXPLAIN 查看执行计划。

# 添加主键
alter table student
add primary key (id);
# 按主键查询,显示type=const
explain
select *
from student
where id = 1;

💡 关键观察type 列的值为 const,表示通过主键精确匹配,效率最高。


📌 题目 11:EXPLAIN —— 普通索引查询#

需求:为 name 字段创建普通索引后,执行按姓名查询,并用 EXPLAIN 查看执行计划。

# 对name创建普通索引
alter table student
add index idx_name (name);
# 按name查询,显示type=ref,这代表了使用了普通索引
explain
select *
from student
where name = '张三';

💡 关键观察type 列的值通常为 ref,表示使用了普通索引进行匹配。


📌 题目 12:EXPLAIN —— 无索引查询对比#

需求:删除 name 字段的索引后,再次执行按姓名查询,对比 EXPLAIN 的结果。

# 对name删除普通索引
alter table student
drop index idx_name ;
# 按name查询,显示type=ALL,这代表了使用了普通索引
explain
select *
from student
where name = '张三';

💡 关键观察type 列变回 ALL(全表扫描),说明没有索引可用,MySQL 必须逐行查找。


四、综合练习#

📌 题目 13:综合操作#

请按以下顺序完成操作,每一步都用 SHOW INDEX 验证结果:

  1. email 字段创建唯一索引
  2. age 字段创建普通索引
  3. 查看当前所有索引
  4. 删除 age 字段的普通索引
  5. 再次查看所有索引
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 indexUsing where 等)

📖 练习建议:建议在本地 MySQL 8 环境中逐题执行,观察每一步的结果变化,加深理解。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
20260705MySQL作业题
https://kulve.tech/posts/heimamysql/20260705mysql作业题/
作者
Kulve
发布于
2026-07-05
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kulve
Hello, I'm Kulve.
公告
欢迎来到我的博客!这是一则示例公告。正在建设与测试此网站。
分类
标签
最新动态
站点统计
文章
17
分类
10
标签
23
总字数
33,120
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.15.2
文章许可
CC BY-NC-SA 4.0