guoyu/Test/sql/fix_slow_queries.sql

215 lines
6.7 KiB
MySQL
Raw Normal View History

-- ================================================
-- 修复慢查询问题
-- ================================================
-- 问题角色查询、课程查询、学习详情查询都很慢0.5-0.8秒)
-- 原因:缺少必要的索引
-- ================================================
USE study;
SELECT '开始优化慢查询索引...' AS info;
-- ================================================
-- 1. 检查并优化 sys_user_role 表索引
-- ================================================
SELECT '检查 sys_user_role 表索引...' AS info;
-- 查看当前索引
SELECT DISTINCT INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'sys_user_role'
ORDER BY INDEX_NAME, SEQ_IN_INDEX;
-- 检查 user_id 索引是否存在
SELECT COUNT(*) INTO @user_id_index_exists
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'sys_user_role'
AND INDEX_NAME = 'idx_user_id';
-- 如果不存在则创建
SET @sql = IF(@user_id_index_exists = 0,
'ALTER TABLE sys_user_role ADD INDEX idx_user_id (user_id)',
'SELECT "idx_user_id 已存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 检查 role_id 索引是否存在
SELECT COUNT(*) INTO @role_id_index_exists
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'sys_user_role'
AND INDEX_NAME = 'idx_role_id';
-- 如果不存在则创建
SET @sql = IF(@role_id_index_exists = 0,
'ALTER TABLE sys_user_role ADD INDEX idx_role_id (role_id)',
'SELECT "idx_role_id 已存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ================================================
-- 2. 检查并优化 sys_role 表索引
-- ================================================
SELECT '检查 sys_role 表索引...' AS info;
-- 查看当前索引
SELECT DISTINCT INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'sys_role'
ORDER BY INDEX_NAME, SEQ_IN_INDEX;
-- 检查 del_flag 索引是否存在
SELECT COUNT(*) INTO @del_flag_index_exists
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'sys_role'
AND INDEX_NAME = 'idx_del_flag';
-- 如果不存在则创建
SET @sql = IF(@del_flag_index_exists = 0,
'ALTER TABLE sys_role ADD INDEX idx_del_flag (del_flag)',
'SELECT "idx_del_flag 已存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ================================================
-- 3. 检查并优化 courseware 表索引
-- ================================================
SELECT '检查 courseware 表索引...' AS info;
-- 查看当前索引
SELECT DISTINCT INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'courseware'
ORDER BY INDEX_NAME, SEQ_IN_INDEX;
-- 检查 course_id 索引是否存在
SELECT COUNT(*) INTO @course_id_index_exists
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'courseware'
AND INDEX_NAME = 'idx_course_id';
-- 如果不存在则创建
SET @sql = IF(@course_id_index_exists = 0,
'ALTER TABLE courseware ADD INDEX idx_course_id (course_id)',
'SELECT "idx_course_id 已存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ================================================
-- 4. 检查并优化 learning_detail 表索引
-- ================================================
SELECT '检查 learning_detail 表索引...' AS info;
-- 查看当前索引
SELECT DISTINCT INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'learning_detail'
ORDER BY INDEX_NAME, SEQ_IN_INDEX;
-- 检查复合索引 (student_id, course_id) 是否存在
SELECT COUNT(*) INTO @student_course_index_exists
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'learning_detail'
AND INDEX_NAME = 'idx_student_course';
-- 如果不存在则创建
SET @sql = IF(@student_course_index_exists = 0,
'ALTER TABLE learning_detail ADD INDEX idx_student_course (student_id, course_id)',
'SELECT "idx_student_course 已存在" AS result'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ================================================
-- 5. 分析表以更新统计信息
-- ================================================
SELECT '分析表以更新统计信息...' AS info;
ANALYZE TABLE sys_user_role;
ANALYZE TABLE sys_role;
ANALYZE TABLE courseware;
ANALYZE TABLE learning_detail;
ANALYZE TABLE sys_user;
-- ================================================
-- 6. 显示优化后的索引情况
-- ================================================
SELECT '优化完成!以下是各表的索引情况:' AS info;
SELECT '=== sys_user_role 表索引 ===' AS info;
SELECT DISTINCT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS columns
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'sys_user_role'
GROUP BY INDEX_NAME;
SELECT '=== sys_role 表索引 ===' AS info;
SELECT DISTINCT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS columns
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'sys_role'
GROUP BY INDEX_NAME;
SELECT '=== courseware 表索引 ===' AS info;
SELECT DISTINCT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS columns
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'courseware'
GROUP BY INDEX_NAME;
SELECT '=== learning_detail 表索引 ===' AS info;
SELECT DISTINCT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS columns
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME = 'learning_detail'
GROUP BY INDEX_NAME;
-- ================================================
-- 7. 测试查询性能
-- ================================================
SELECT '测试查询性能...' AS info;
-- 测试角色查询
SET @start = NOW(6);
SELECT COUNT(*) FROM sys_user_role WHERE user_id = 455;
SET @end = NOW(6);
SELECT TIMESTAMPDIFF(MICROSECOND, @start, @end)/1000 AS '角色查询耗时(ms)';
-- 测试课程查询
SET @start = NOW(6);
SELECT COUNT(*) FROM courseware WHERE course_id = 6;
SET @end = NOW(6);
SELECT TIMESTAMPDIFF(MICROSECOND, @start, @end)/1000 AS '课程查询耗时(ms)';
-- 测试学习详情查询
SET @start = NOW(6);
SELECT COUNT(*) FROM learning_detail WHERE student_id = 9999 AND course_id = 6;
SET @end = NOW(6);
SELECT TIMESTAMPDIFF(MICROSECOND, @start, @end)/1000 AS '学习详情查询耗时(ms)';
SELECT '所有优化完成!预期查询速度提升到 10-50ms' AS info;