189 lines
5.4 KiB
MySQL
189 lines
5.4 KiB
MySQL
|
|
-- ================================================
|
|||
|
|
-- 导入性能优化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;
|