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