MySQL数据库:删除索引
简介
本指南记录了在 MySQL 测试环境中对 pre_forum_post
表进行的索引删除操作,旨在验证索引对数据库性能的影响以及容灾恢复能力。操作包括删除主键索引、唯一索引和常用复合索引,并详细记录了操作前后的索引状态变化。
注意:本操作在测试环境进行,建议备份数据库或者打快照再操作。
pre_forum_post 表索引删除前状态
序号 | 表名 | 是否唯一 | 索引名 | 索引顺序 | 列名 | 排序规则 | 基数 | 索引类型 | 是否可见 |
---|---|---|---|---|---|---|---|---|---|
1 | pre_forum_post | 0 | PRIMARY | 1 | tid | A | 0 | BTREE | YES |
2 | pre_forum_post | 0 | PRIMARY | 2 | position | A | 0 | BTREE | YES |
3 | pre_forum_post | 0 | pid | 1 | pid | A | 0 | BTREE | YES |
4 | pre_forum_post | 1 | fid | 1 | fid | A | 0 | BTREE | YES |
5 | pre_forum_post | 1 | authorid | 1 | authorid | A | 0 | BTREE | YES |
6 | pre_forum_post | 1 | authorid | 2 | invisible | A | 0 | BTREE | YES |
7 | pre_forum_post | 1 | dateline | 1 | dateline | A | 0 | BTREE | YES |
8 | pre_forum_post | 1 | invisible | 1 | invisible | A | 0 | BTREE | YES |
9 | pre_forum_post | 1 | displayorder | 1 | tid | A | 0 | BTREE | YES |
10 | pre_forum_post | 1 | displayorder | 2 | invisible | A | 0 | BTREE | YES |
11 | pre_forum_post | 1 | displayorder | 3 | dateline | A | 0 | BTREE | YES |
12 | pre_forum_post | 1 | first | 1 | tid | A | 0 | BTREE | YES |
13 | pre_forum_post | 1 | first | 2 | first | A | 0 | BTREE | YES |
操作步骤
1. 切换到目标数据库
确保操作在正确的数据库中:
USE discuz;
确认当前数据库:
SELECT DATABASE();
输出应为 discuz
。
2. 查看当前索引
检查 pre_forum_post
表的索引,确认要删除的索引存在:
SHOW INDEX FROM pre_forum_post\G
- 输出将列出所有索引,注意
Key_name
字段,如dateline
、authorid
、first
和displayorder
。 tid
出现在PRIMARY
、first
和displayorder
中;dateline
出现在dateline
和displayorder
中;authorid
出现在authorid
中。
3. 删除目标索引
操作前请先打快照或者备份!!!!
(1). 删除主键索引 PRIMARY
ALTER TABLE `pre_forum_post` DROP PRIMARY KEY;
(2). 删除高频使用的 authorid
复合索引
ALTER TABLE `pre_forum_post` DROP INDEX `authorid`;
(3). 删除唯一索引 pid
ALTER TABLE `pre_forum_post` DROP INDEX `pid`;
总结
操作 | 命令 | 测试目标 |
---|---|---|
删除主键 | ALTER TABLE DROP PRIMARY KEY |
主键丢失后的恢复能力 |
删除 authorid 索引 |
ALTER TABLE DROP INDEX authorid |
慢查询监控是否生效 |
删除 pid 唯一索引 |
ALTER TABLE DROP INDEX pid |
唯一约束失效后的数据检测 |
4. 验证索引删除
再次查看索引:
SHOW INDEX FROM pre_forum_post\G
预期输出:只剩以下索引:
fid
(非唯一索引)dateline
(非唯一索引)invisible
(非唯一索引)displayorder
(复合索引:tid, invisible, dateline
)first
(复合索引:tid, first
)
说明
- 已删除的索引:
PRIMARY
(主键索引tid, position
)pid
(唯一索引)authorid
(复合索引authorid, invisible
)
- 保留的索引:
- 单列索引:
fid
(版块ID)dateline
(发帖时间)invisible
(帖子可见性)
- 复合索引:
displayorder
(用于帖子排序)first
(标记主题首帖)
- 单列索引:
- 验证方式:
- 执行
SHOW INDEX FROM pre_forum_post
应只显示上述 5 个索引。 - 确认
PRIMARY
、pid
、authorid
索引已消失。
- 执行
pre_forum_post 表索引删除后状态
序号 | 表名 | 是否唯一 | 索引名 | 索引顺序 | 列名 | 排序规则 | 基数 | 索引类型 | 是否可见 |
---|---|---|---|---|---|---|---|---|---|
1 | pre_forum_post | (删除不显示) | PRIMARY | ||||||
2 | pre_forum_post | (删除不显示) | pid | ||||||
3 | pre_forum_post | (删除不显示) | authorid | ||||||
4 | pre_forum_post | 1 | fid | 1 | fid | A | 0 | BTREE | YES |
5 | pre_forum_post | 1 | dateline | 1 | dateline | A | 0 | BTREE | YES |
6 | pre_forum_post | 1 | invisible | 1 | invisible | A | 0 | BTREE | YES |
7 | pre_forum_post | 1 | displayorder | 1 | tid | A | 0 | BTREE | YES |
8 | pre_forum_post | 1 | displayorder | 2 | invisible | A | 0 | BTREE | YES |
9 | pre_forum_post | 1 | displayorder | 3 | dateline | A | 0 | BTREE | YES |
10 | pre_forum_post | 1 | first | 1 | tid | A | 0 | BTREE | YES |
11 | pre_forum_post | 1 | first | 2 | first | A | 0 | BTREE | YES |
操作概述
删除的索引
- 主键索引:
PRIMARY(tid, position)
- 唯一索引:
pid
- 复合索引:
authorid(authorid, invisible)
保留的索引
- 单列索引:
fid
,dateline
,invisible
- 复合索引:
displayorder(tid, invisible, dateline)
,first(tid, first)
删除操作只执行了三条命令,但结果显示 5个索引条目消失(序号1,2,3,5,6)
根本原因:复合索引的存储结构
- 主键索引
- 虽然是一个逻辑索引,但物理存储包含
tid
(序号1)和position
(序号2)两列,删除时会同时移除。
- 虽然是一个逻辑索引,但物理存储包含
authorid
复合索引- 由
authorid
(序号5)和invisible
(序号6)两列组成,删除索引时会整体移除。
- 由
pid
单列索引- 独立索引(序号3),直接删除即可。
为什么看起来删了3个索引却少了5条记录?
MySQL 的 SHOW INDEX
结果中:
- 每个索引的每一列都会单独显示一行
- 删除整个索引会同时移除其所有列条目
索引名称 | 包含列 | 显示行数 | 删除影响 |
---|---|---|---|
PRIMARY | tid, position | 2行 | 删除后序号1,2消失 |
authorid | authorid, invisible | 2行 | 删除后序号5,6消失 |
pid | pid | 1行 | 删除后序号3消失 |