guoyu/log/Sql/fix_redundant_indexes.sql

215 lines
6.8 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ================================================
-- 删除冗余索引,恢复系统速度
-- ================================================
-- 问题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;