guoyu/log/Sql/optimize_import_performance.sql

189 lines
5.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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