当前位置:首页 > 文章列表 > 数据库 > 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推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    5905次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    6334次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    6142次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    8117次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    6650次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码