-- ================================================ -- 导入性能优化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;