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 字段,如 datelineauthoridfirstdisplayorder
  • tid 出现在 PRIMARYfirstdisplayorder 中;dateline 出现在 datelinedisplayorder 中;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

    说明

    1. 已删除的索引
      • PRIMARY(主键索引 tid, position
      • pid(唯一索引)
      • authorid(复合索引 authorid, invisible
    2. 保留的索引
      • 单列索引:
        • fid(版块ID)
        • dateline(发帖时间)
        • invisible(帖子可见性)
      • 复合索引:
        • displayorder(用于帖子排序)
        • first(标记主题首帖)
    3. 验证方式
      • 执行 SHOW INDEX FROM pre_forum_post 应只显示上述 5 个索引。
      • 确认 PRIMARYpidauthorid 索引已消失。

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

操作概述

删除的索引

  1. 主键索引PRIMARY(tid, position)
  2. 唯一索引pid
  3. 复合索引authorid(authorid, invisible)

保留的索引

  1. 单列索引:fid, dateline, invisible
  2. 复合索引:displayorder(tid, invisible, dateline), first(tid, first)

删除操作只执行了三条命令,但结果显示 5个索引条目消失(序号1,2,3,5,6)

根本原因:复合索引的存储结构

  1. 主键索引
    • 虽然是一个逻辑索引,但物理存储包含 tid(序号1)和 position(序号2)两列,删除时会同时移除。
  2. authorid 复合索引
    • authorid(序号5)和 invisible(序号6)两列组成,删除索引时会整体移除。
  3. pid 单列索引
    • 独立索引(序号3),直接删除即可。

为什么看起来删了3个索引却少了5条记录?

MySQL 的 SHOW INDEX 结果中:

  • 每个索引的每一列都会单独显示一行
  • 删除整个索引会同时移除其所有列条目
索引名称 包含列 显示行数 删除影响
PRIMARY tid, position 2行 删除后序号1,2消失
authorid authorid, invisible 2行 删除后序号5,6消失
pid pid 1行 删除后序号3消失

2025-07-22_093352-2

2025-07-22_093352-1

梦葉樱 all right reserved,powered by Gitbook该文件最后修改时间: 2025-07-22 15:33:52

results matching ""

    No results matching ""