guoyu/log/Sql/fix_redundant_indexes.sql

215 lines
6.8 KiB
MySQL
Raw Normal View History

-- ================================================
-- 删除冗余索引,恢复系统速度
-- ================================================
-- 问题idx_student_id 与 uk_student_class 的第一列重复
-- 导致:写入性能下降,系统变慢
-- ================================================
USE study;
SELECT '开始删除冗余索引...' AS info;
-- ================================================
-- 1. 删除 student_class 表的冗余索引
-- ================================================
SELECT '删除 student_class.idx_student_id (冗余uk_student_class已覆盖)' AS info;
-- 检查索引是否存在
SELECT COUNT(*) INTO @index_exists
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'student_class'
AND INDEX_NAME = 'idx_student_id';
-- 如果存在则删除
SET @sql = IF(@index_exists > 0,
'ALTER TABLE student_class DROP INDEX idx_student_id',
'SELECT "idx_student_id 不存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ================================================
-- 2. 删除 idx_class_id如果不需要
-- ================================================
-- 注意:只有当确认不需要单独的 class_id 查询时才删除
-- 如果有 WHERE class_id = ? 的查询,建议保留
SELECT '检查 idx_class_id 是否需要保留...' AS info;
-- 暂时保留 idx_class_id因为可能有按 class_id 查询的需求
-- 如果确认不需要,取消下面的注释
-- ALTER TABLE student_class DROP INDEX idx_class_id;
SELECT 'idx_class_id 已保留(如果不需要可手动删除)' AS result;
-- ================================================
-- 3. 检查 sys_user 表的索引(可能也有冗余)
-- ================================================
SELECT '检查 sys_user 表索引...' AS info;
SELECT
INDEX_NAME AS '索引名',
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS '',
INDEX_TYPE AS '类型',
CASE NON_UNIQUE WHEN 0 THEN '唯一' ELSE '非唯一' END AS '属性'
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'sys_user'
GROUP BY INDEX_NAME, INDEX_TYPE, NON_UNIQUE
ORDER BY INDEX_NAME;
-- ================================================
-- 建议删除的 sys_user 索引(如果是优化时添加的)
-- ================================================
SELECT '删除 sys_user 的优化索引(如果存在)...' AS info;
-- idx_user_name如果有唯一索引或其他索引覆盖
SET @sql = IF(
EXISTS(SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study' AND TABLE_NAME = 'sys_user'
AND INDEX_NAME = 'idx_user_name'),
'ALTER TABLE sys_user DROP INDEX idx_user_name',
'SELECT "idx_user_name 不存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- idx_nick_name
SET @sql = IF(
EXISTS(SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study' AND TABLE_NAME = 'sys_user'
AND INDEX_NAME = 'idx_nick_name'),
'ALTER TABLE sys_user DROP INDEX idx_nick_name',
'SELECT "idx_nick_name 不存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- idx_email
SET @sql = IF(
EXISTS(SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study' AND TABLE_NAME = 'sys_user'
AND INDEX_NAME = 'idx_email'),
'ALTER TABLE sys_user DROP INDEX idx_email',
'SELECT "idx_email 不存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- idx_dept_id
SET @sql = IF(
EXISTS(SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study' AND TABLE_NAME = 'sys_user'
AND INDEX_NAME = 'idx_dept_id'),
'ALTER TABLE sys_user DROP INDEX idx_dept_id',
'SELECT "idx_dept_id 不存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- idx_status
SET @sql = IF(
EXISTS(SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study' AND TABLE_NAME = 'sys_user'
AND INDEX_NAME = 'idx_status'),
'ALTER TABLE sys_user DROP INDEX idx_status',
'SELECT "idx_status 不存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- idx_del_flag
SET @sql = IF(
EXISTS(SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study' AND TABLE_NAME = 'sys_user'
AND INDEX_NAME = 'idx_del_flag'),
'ALTER TABLE sys_user DROP INDEX idx_del_flag',
'SELECT "idx_del_flag 不存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- idx_register_type
SET @sql = IF(
EXISTS(SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study' AND TABLE_NAME = 'sys_user'
AND INDEX_NAME = 'idx_register_type'),
'ALTER TABLE sys_user DROP INDEX idx_register_type',
'SELECT "idx_register_type 不存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- idx_student_status
SET @sql = IF(
EXISTS(SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study' AND TABLE_NAME = 'sys_user'
AND INDEX_NAME = 'idx_student_status'),
'ALTER TABLE sys_user DROP INDEX idx_student_status',
'SELECT "idx_student_status 不存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ================================================
-- 4. 重新分析表
-- ================================================
SELECT '重新分析表...' AS info;
ANALYZE TABLE sys_user;
ANALYZE TABLE student_class;
-- ================================================
-- 5. 验证优化结果
-- ================================================
SELECT '优化完成,验证结果...' AS info;
-- 查看 student_class 剩余索引
SELECT '剩余索引 - student_class:' AS info;
SELECT
INDEX_NAME AS '索引名',
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS ''
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'student_class'
GROUP BY INDEX_NAME
ORDER BY INDEX_NAME;
-- 查看 sys_user 剩余索引
SELECT '剩余索引 - sys_user:' AS info;
SELECT
INDEX_NAME AS '索引名',
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS ''
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'sys_user'
GROUP BY INDEX_NAME
ORDER BY INDEX_NAME;
-- 统计索引数量
SELECT
TABLE_NAME AS '表名',
COUNT(DISTINCT INDEX_NAME) AS '索引数量'
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME IN ('sys_user', 'student_class')
GROUP BY TABLE_NAME;
SELECT '冗余索引删除完成!系统速度应该恢复正常。' AS info;
SELECT '如果需要保留某些索引,请手动添加回来。' AS info;