guoyu/log/Sql/optimize_import_performance.sql

189 lines
5.4 KiB
MySQL
Raw Normal View History

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