215 lines
6.7 KiB
SQL
215 lines
6.7 KiB
SQL
-- ================================================
|
||
-- 修复慢查询问题
|
||
-- ================================================
|
||
-- 问题:角色查询、课程查询、学习详情查询都很慢(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;
|