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