前置知识: MySQL

不可见索引

00:00
1 min Intermediate 2026/6/14

MySQL不可见索引:索引可见性控制、优化器忽略、安全删除索引与灰度验证

1. 不可见索引概述

不可见索引(Invisible Index)优化器不可见,但仍然被维护(INSERT/UPDATE/DELETE 仍更新索引)。

2. 语法

-- 创建不可见索引
CREATE INDEX idx_name ON employees(name) INVISIBLE;

-- 修改索引可见性
ALTER TABLE employees ALTER INDEX idx_name INVISIBLE;
ALTER TABLE employees ALTER INDEX idx_name VISIBLE;

-- 查看索引可见性
SELECT index_name, is_visible
FROM information_schema.statistics
WHERE table_name = 'employees';

3. 使用场景

3.1 安全删除索引

-- 步骤1:将索引设为不可见
ALTER TABLE employees ALTER INDEX idx_old INVISIBLE;

-- 步骤2:观察一段时间,确认无性能问题
-- 如果出现问题,快速恢复
ALTER TABLE employees ALTER INDEX idx_old VISIBLE;

-- 步骤3:确认安全后删除
DROP INDEX idx_old ON employees;

3.2 灰度测试新索引

-- 创建不可见的新索引
CREATE INDEX idx_new ON employees(dept_id, salary) INVISIBLE;

-- 特定会话测试
SET SESSION optimizer_switch = 'use_invisible_indexes=on';
EXPLAIN SELECT * FROM employees WHERE dept_id = 5 ORDER BY salary;
-- 可以使用新索引

-- 其他会话不受影响

4. 注意事项

-- 不可见索引仍被维护,写入开销不变
-- 主键索引不能设为不可见
-- UNIQUE 约束索引设为不可见后,约束仍然生效

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式