-- ================================================
-- 导入性能优化SQL
-- 功能：添加必要的索引，提升导入速度
-- 执行前：备份数据库
-- ================================================

USE study;

-- ================================================
-- 1. 检查现有索引
-- ================================================

-- 查看 sys_user 表的索引
SHOW INDEX FROM sys_user;

-- 查看 student_class 表的索引
SHOW INDEX FROM student_class;

-- ================================================
-- 2. 添加索引
-- ================================================

-- 为 sys_user 表添加索引
-- 用于快速按信息编号（user_name）查询用户
-- 如果索引已存在会报错，可以忽略
ALTER TABLE sys_user ADD INDEX idx_user_name (user_name);

-- 用于快速按用户名（nick_name）查询
ALTER TABLE sys_user ADD INDEX idx_nick_name (nick_name);

-- 用于快速按监区查询
ALTER TABLE sys_user ADD INDEX idx_prison_area (prison_area);

-- 为 student_class 表添加索引
-- 用于快速按学员ID查询班级
ALTER TABLE student_class ADD INDEX idx_student_id (student_id);

-- 用于快速按班级ID查询学员
ALTER TABLE student_class ADD INDEX idx_class_id (class_id);

-- 用于快速按状态查询
ALTER TABLE student_class ADD INDEX idx_status (status);

-- 复合索引：学员ID + 状态（常用查询组合）
ALTER TABLE student_class ADD INDEX idx_student_status (student_id, status);

-- ================================================
-- 3. 优化已有索引（如果需要）
-- ================================================

-- 检查唯一键是否已优化
SHOW INDEX FROM student_class WHERE Key_name = 'uk_student_class';

-- 如果唯一键不包含 status，可能需要重建
-- 注意：重建索引前请先备份数据！
-- ALTER TABLE student_class DROP INDEX uk_student_class;
-- ALTER TABLE student_class ADD UNIQUE INDEX uk_student_class (student_id, class_id);

-- ================================================
-- 4. 分析表统计信息
-- ================================================

-- 更新表统计信息，帮助查询优化器选择更好的执行计划
ANALYZE TABLE sys_user;
ANALYZE TABLE student_class;
ANALYZE TABLE study_class;

-- ================================================
-- 5. 验证索引效果
-- ================================================

-- 测试查询1：按user_name查询（应该使用idx_user_name）
EXPLAIN SELECT * FROM sys_user WHERE user_name = '201';

-- 测试查询2：按student_id查询班级（应该使用idx_student_id）
EXPLAIN SELECT * FROM student_class WHERE student_id = 234;

-- 测试查询3：按student_id和status查询（应该使用idx_student_status）
EXPLAIN SELECT * FROM student_class WHERE student_id = 234 AND status = 1;

-- ================================================
-- 6. 清理慢查询日志（可选）
-- ================================================

-- 查看慢查询日志设置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';

-- 临时设置慢查询阈值为1秒（用于监控）
SET GLOBAL long_query_time = 1;

-- 清空慢查询日志（可选）
-- TRUNCATE mysql.slow_log;

-- ================================================
-- 7. 检查表碎片（可选）
-- ================================================

-- 查看表信息
SELECT 
    table_name,
    table_rows,
    data_length,
    index_length,
    data_free
FROM information_schema.TABLES 
WHERE table_schema = 'study' 
AND table_name IN ('sys_user', 'student_class');

-- 如果data_free较大，可以优化表
-- OPTIMIZE TABLE sys_user;
-- OPTIMIZE TABLE student_class;

-- ================================================
-- 8. 检查并优化字段类型（可选）
-- ================================================

-- 查看字段定义
DESCRIBE sys_user;
DESCRIBE student_class;

-- 建议：
-- 1. user_name (信息编号) 建议使用 VARCHAR(50) 而不是 VARCHAR(255)
-- 2. 日期字段使用 DATE 而不是 DATETIME（如果不需要时间）
-- 3. 状态字段使用 TINYINT 而不是 INT

-- ================================================
-- 9. 性能监控查询
-- ================================================

-- 查看当前正在执行的查询
SELECT 
    id,
    user,
    host,
    db,
    command,
    time,
    state,
    info
FROM information_schema.processlist 
WHERE command != 'Sleep'
ORDER BY time DESC;

-- 查看慢查询统计
SELECT 
    count(*) as slow_query_count,
    sql_text
FROM mysql.slow_log 
GROUP BY sql_text 
ORDER BY slow_query_count DESC 
LIMIT 10;

-- ================================================
-- 10. 导入性能测试
-- ================================================

-- 测试前记录时间
SELECT NOW() as test_start_time;

-- 执行导入操作...

-- 测试后记录时间
SELECT NOW() as test_end_time;

-- 查看慢查询
SELECT * FROM mysql.slow_log 
WHERE start_time > '2025-12-05 14:00:00'
ORDER BY query_time DESC
LIMIT 20;

-- ================================================
-- 完成！
-- ================================================

-- 验证索引已创建
SELECT 
    TABLE_NAME,
    INDEX_NAME,
    COLUMN_NAME,
    SEQ_IN_INDEX
FROM information_schema.STATISTICS 
WHERE TABLE_SCHEMA = 'study'
AND TABLE_NAME IN ('sys_user', 'student_class')
ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;

-- 显示优化建议
SELECT 'Indexes added successfully! Please test import performance.' AS result;
