当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL 不可见索引实战:想删索引又怕翻车,先做一次生产级预演

MySQL 不可见索引实战:想删索引又怕翻车,先做一次生产级预演

来源:17golang 原创 2026-06-02 15:22:32 0浏览 收藏

很多 MySQL 表跑久了以后,索引会越长越多。业务改版留下一批历史索引,临时需求加了一批组合索引,最后每次写入都在替过去的查询买单。但直接删索引又很吓人:万一某个低频报表或后台任务还依赖它,线上慢查询会马上找上门。

我更喜欢先用 MySQL 的不可见索引做一次预演。把索引设为 INVISIBLE 后,优化器默认不会使用它,但 InnoDB 仍然维护这个索引。也就是说,它很适合验证“查询还需不需要这个索引”,不适合验证“删掉以后写入能省多少成本”。这个边界一定要先讲清楚。

MySQL 不可见索引治理思维导图
思维导图:不可见索引把删索引变成可灰度、可观测、可回滚的实验。

不可见索引到底解决什么问题

它解决的是删索引前的风险评估。传统做法是先在测试环境看执行计划,再在线上低峰直接 DROP INDEX。问题是测试环境的数据分布、SQL 覆盖率、业务流量都很难和线上一致。不可见索引提供了一个中间态:索引还在,回滚很快,但优化器先把它当作不存在。

这对于治理冗余索引尤其有价值。比如 (user_id, created_at)(user_id) 同时存在,你怀疑后者已经没意义;或者某个老活动索引长期没有命中,但谁也不敢删。先隐藏,再观察真实流量,判断会稳得多。

先找候选索引,不要全表乱试

我一般从三类索引入手:重复前缀索引、长期没有被执行计划命中的索引、写入成本明显但查询收益存疑的索引。候选出来以后,先记录当前表结构和关键 SQL 的执行计划。

SHOW INDEX FROM orders;

EXPLAIN FORMAT=TREE
SELECT *
FROM orders
WHERE user_id = 1001
ORDER BY created_at DESC
LIMIT 20;

如果你们有 SQL 指纹和慢查询平台,最好把候选索引可能影响的 SQL 都列出来。不要只测一个接口就认为万事大吉,后台任务、报表、客服查询往往才是低频但重的那一类。

MySQL 不可见索引灰度流程
流程图:找候选、做基线、隐藏观察、决定去留,每一步都要能回滚。

隐藏索引的 SQL 很简单,难的是观察

把索引设为不可见通常只需要一条 DDL:

ALTER TABLE orders
  ALTER INDEX idx_user_created INVISIBLE;

隐藏后我会至少观察一个完整业务周期。电商系统要覆盖晚高峰和定时任务,SaaS 系统要覆盖工作日白天,报表系统要覆盖日结或周结。观察项包括慢查询数量、rows examined、执行计划变化、接口 p95/p99、数据库 CPU 和临时表情况。

发现问题时,回滚也很直接:

ALTER TABLE orders
  ALTER INDEX idx_user_created VISIBLE;
MySQL 不可见索引 SQL 案例
案例图:先隐藏索引观察计划,不要直接 DROP INDEX 把回滚变成重建索引。

别把不可见索引用错成性能优化

一个常见误会是:把索引设为不可见以后,写入就会变快。不是这样。只要索引还存在,DML 仍然需要维护它。不可见索引省掉的是优化器选择它的路径,不是省掉索引维护成本。真正要拿到写入收益,最终还是要 DROP INDEX

所以这套流程应该分两段:第一段隐藏索引,验证查询不依赖;第二段删除索引,验证写入收益和空间释放。两段中间最好隔开,留出足够观察时间。

上线检查清单

  • 确认目标库是 MySQL 8.x,并确认主从、备份、灰度环境版本一致。
  • 记录候选索引、可能受影响 SQL、当前执行计划和慢查询基线。
  • 低峰执行 ALTER INDEX ... INVISIBLE,并准备 VISIBLE 回滚语句。
  • 观察至少一个完整业务周期,不只看 10 分钟内的接口流量。
  • 确认没有计划退化、慢查询增长、rows examined 暴涨,再安排真正删除。
  • 删除前再次确认备份和变更窗口,因为 DROP 后回滚成本完全不同。

我的经验结论

不可见索引最适合的场景不是炫技,而是把“删索引”从一次不可逆动作,拆成一次可回滚实验。它让你先回答一个问题:如果优化器不能用这个索引,线上查询会不会出事?

答案稳定以后,再讨论删除索引带来的写入收益和空间收益。这个顺序看起来慢一点,但数据库变更最怕的就是自信过头。能灰度的地方先灰度,能回滚的地方先保留回滚,这才是生产 MySQL 索引治理的基本体面。

版本声明
本文转载于:17golang 原创 如有侵犯,请联系study_golang@163.com删除
JFR 排查 Spring Boot 慢接口:别急着加缓存,先抓一段 Flight RecordingJFR 排查 Spring Boot 慢接口:别急着加缓存,先抓一段 Flight Recording
上一篇
JFR 排查 Spring Boot 慢接口:别急着加缓存,先抓一段 Flight Recording
CompletableFuture 异步接口卡死复盘:别让 commonPool 背锅到凌晨
下一篇
CompletableFuture 异步接口卡死复盘:别让 commonPool 背锅到凌晨
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    158次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    87次使用
  • ClickPrompt:AI提示词生成与优化工具,支持Stable Diffusion、ChatGPT及代码辅助
    ClickPrompt
    ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
    47次使用
  • PromptHero官网:AI提示词搜索、优化与学习平台,支持Midjourney/Stable Diffusion
    PromptHero
    PromptHero是专业的AI提示词搜索引擎与优化平台,支持Stable Diffusion、Midjourney等主流模型。提供海量提示词库、分类搜索、在线课程及社区互动,助力用户高效生成高质量AI图像与文本。
    30次使用
  • OpenArt免费开源指南:Stable Diffusion Prompt Book提示词手册详解
    Stable Diffusion Prompt Book
    深入解析OpenArt推出的Stable Diffusion Prompt Book,这本免费的开源提示词指南涵盖从基础语法到高级技巧,提供风格化词库与参数建议,助您优化AI绘画生成效果。
    30次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码