200 lines
5.7 KiB
MySQL
200 lines
5.7 KiB
MySQL
|
|
-- ================================================
|
|||
|
|
-- 导入性能优化SQL(安全版本)
|
|||
|
|
-- 功能:添加必要的索引,提升导入速度
|
|||
|
|
-- 特点:自动检查索引是否存在,避免重复创建
|
|||
|
|
-- 执行前:备份数据库
|
|||
|
|
-- ================================================
|
|||
|
|
|
|||
|
|
USE study;
|
|||
|
|
|
|||
|
|
-- ================================================
|
|||
|
|
-- 1. 检查现有索引
|
|||
|
|
-- ================================================
|
|||
|
|
|
|||
|
|
SELECT '查看 sys_user 表的索引' AS info;
|
|||
|
|
SHOW INDEX FROM sys_user;
|
|||
|
|
|
|||
|
|
SELECT '查看 student_class 表的索引' AS info;
|
|||
|
|
SHOW INDEX FROM student_class;
|
|||
|
|
|
|||
|
|
-- ================================================
|
|||
|
|
-- 2. 安全地添加索引(跳过已存在的索引)
|
|||
|
|
-- ================================================
|
|||
|
|
|
|||
|
|
-- 为 sys_user 表添加索引
|
|||
|
|
SELECT '开始为 sys_user 表添加索引...' AS info;
|
|||
|
|
|
|||
|
|
-- idx_user_name
|
|||
|
|
SET @sql = (
|
|||
|
|
SELECT IF(
|
|||
|
|
COUNT(*) = 0,
|
|||
|
|
'ALTER TABLE sys_user ADD INDEX idx_user_name (user_name)',
|
|||
|
|
'SELECT ''索引 idx_user_name 已存在,跳过'' AS result'
|
|||
|
|
)
|
|||
|
|
FROM information_schema.statistics
|
|||
|
|
WHERE table_schema = 'study'
|
|||
|
|
AND table_name = 'sys_user'
|
|||
|
|
AND index_name = 'idx_user_name'
|
|||
|
|
);
|
|||
|
|
PREPARE stmt FROM @sql;
|
|||
|
|
EXECUTE stmt;
|
|||
|
|
DEALLOCATE PREPARE stmt;
|
|||
|
|
|
|||
|
|
-- idx_nick_name
|
|||
|
|
SET @sql = (
|
|||
|
|
SELECT IF(
|
|||
|
|
COUNT(*) = 0,
|
|||
|
|
'ALTER TABLE sys_user ADD INDEX idx_nick_name (nick_name)',
|
|||
|
|
'SELECT ''索引 idx_nick_name 已存在,跳过'' AS result'
|
|||
|
|
)
|
|||
|
|
FROM information_schema.statistics
|
|||
|
|
WHERE table_schema = 'study'
|
|||
|
|
AND table_name = 'sys_user'
|
|||
|
|
AND index_name = 'idx_nick_name'
|
|||
|
|
);
|
|||
|
|
PREPARE stmt FROM @sql;
|
|||
|
|
EXECUTE stmt;
|
|||
|
|
DEALLOCATE PREPARE stmt;
|
|||
|
|
|
|||
|
|
-- idx_prison_area
|
|||
|
|
SET @sql = (
|
|||
|
|
SELECT IF(
|
|||
|
|
COUNT(*) = 0,
|
|||
|
|
'ALTER TABLE sys_user ADD INDEX idx_prison_area (prison_area)',
|
|||
|
|
'SELECT ''索引 idx_prison_area 已存在,跳过'' AS result'
|
|||
|
|
)
|
|||
|
|
FROM information_schema.statistics
|
|||
|
|
WHERE table_schema = 'study'
|
|||
|
|
AND table_name = 'sys_user'
|
|||
|
|
AND index_name = 'idx_prison_area'
|
|||
|
|
);
|
|||
|
|
PREPARE stmt FROM @sql;
|
|||
|
|
EXECUTE stmt;
|
|||
|
|
DEALLOCATE PREPARE stmt;
|
|||
|
|
|
|||
|
|
-- 为 student_class 表添加索引
|
|||
|
|
SELECT '开始为 student_class 表添加索引...' AS info;
|
|||
|
|
|
|||
|
|
-- idx_student_id
|
|||
|
|
SET @sql = (
|
|||
|
|
SELECT IF(
|
|||
|
|
COUNT(*) = 0,
|
|||
|
|
'ALTER TABLE student_class ADD INDEX idx_student_id (student_id)',
|
|||
|
|
'SELECT ''索引 idx_student_id 已存在,跳过'' AS result'
|
|||
|
|
)
|
|||
|
|
FROM information_schema.statistics
|
|||
|
|
WHERE table_schema = 'study'
|
|||
|
|
AND table_name = 'student_class'
|
|||
|
|
AND index_name = 'idx_student_id'
|
|||
|
|
);
|
|||
|
|
PREPARE stmt FROM @sql;
|
|||
|
|
EXECUTE stmt;
|
|||
|
|
DEALLOCATE PREPARE stmt;
|
|||
|
|
|
|||
|
|
-- idx_class_id
|
|||
|
|
SET @sql = (
|
|||
|
|
SELECT IF(
|
|||
|
|
COUNT(*) = 0,
|
|||
|
|
'ALTER TABLE student_class ADD INDEX idx_class_id (class_id)',
|
|||
|
|
'SELECT ''索引 idx_class_id 已存在,跳过'' AS result'
|
|||
|
|
)
|
|||
|
|
FROM information_schema.statistics
|
|||
|
|
WHERE table_schema = 'study'
|
|||
|
|
AND table_name = 'student_class'
|
|||
|
|
AND index_name = 'idx_class_id'
|
|||
|
|
);
|
|||
|
|
PREPARE stmt FROM @sql;
|
|||
|
|
EXECUTE stmt;
|
|||
|
|
DEALLOCATE PREPARE stmt;
|
|||
|
|
|
|||
|
|
-- idx_status
|
|||
|
|
SET @sql = (
|
|||
|
|
SELECT IF(
|
|||
|
|
COUNT(*) = 0,
|
|||
|
|
'ALTER TABLE student_class ADD INDEX idx_status (status)',
|
|||
|
|
'SELECT ''索引 idx_status 已存在,跳过'' AS result'
|
|||
|
|
)
|
|||
|
|
FROM information_schema.statistics
|
|||
|
|
WHERE table_schema = 'study'
|
|||
|
|
AND table_name = 'student_class'
|
|||
|
|
AND index_name = 'idx_status'
|
|||
|
|
);
|
|||
|
|
PREPARE stmt FROM @sql;
|
|||
|
|
EXECUTE stmt;
|
|||
|
|
DEALLOCATE PREPARE stmt;
|
|||
|
|
|
|||
|
|
-- idx_student_status (复合索引)
|
|||
|
|
SET @sql = (
|
|||
|
|
SELECT IF(
|
|||
|
|
COUNT(*) = 0,
|
|||
|
|
'ALTER TABLE student_class ADD INDEX idx_student_status (student_id, status)',
|
|||
|
|
'SELECT ''索引 idx_student_status 已存在,跳过'' AS result'
|
|||
|
|
)
|
|||
|
|
FROM information_schema.statistics
|
|||
|
|
WHERE table_schema = 'study'
|
|||
|
|
AND table_name = 'student_class'
|
|||
|
|
AND index_name = 'idx_student_status'
|
|||
|
|
);
|
|||
|
|
PREPARE stmt FROM @sql;
|
|||
|
|
EXECUTE stmt;
|
|||
|
|
DEALLOCATE PREPARE stmt;
|
|||
|
|
|
|||
|
|
SELECT '索引添加完成!' AS info;
|
|||
|
|
|
|||
|
|
-- ================================================
|
|||
|
|
-- 3. 分析表统计信息
|
|||
|
|
-- ================================================
|
|||
|
|
|
|||
|
|
SELECT '更新表统计信息...' AS info;
|
|||
|
|
ANALYZE TABLE sys_user;
|
|||
|
|
ANALYZE TABLE student_class;
|
|||
|
|
ANALYZE TABLE study_class;
|
|||
|
|
|
|||
|
|
-- ================================================
|
|||
|
|
-- 4. 验证索引创建结果
|
|||
|
|
-- ================================================
|
|||
|
|
|
|||
|
|
SELECT '验证 sys_user 表索引' AS info;
|
|||
|
|
SHOW INDEX FROM sys_user;
|
|||
|
|
|
|||
|
|
SELECT '验证 student_class 表索引' AS info;
|
|||
|
|
SHOW INDEX FROM student_class;
|
|||
|
|
|
|||
|
|
-- 详细的索引列表
|
|||
|
|
SELECT
|
|||
|
|
TABLE_NAME AS '表名',
|
|||
|
|
INDEX_NAME AS '索引名',
|
|||
|
|
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS '索引列',
|
|||
|
|
INDEX_TYPE AS '索引类型',
|
|||
|
|
CASE NON_UNIQUE
|
|||
|
|
WHEN 0 THEN '唯一'
|
|||
|
|
ELSE '非唯一'
|
|||
|
|
END AS '索引属性'
|
|||
|
|
FROM information_schema.STATISTICS
|
|||
|
|
WHERE TABLE_SCHEMA = 'study'
|
|||
|
|
AND TABLE_NAME IN ('sys_user', 'student_class')
|
|||
|
|
GROUP BY TABLE_NAME, INDEX_NAME, INDEX_TYPE, NON_UNIQUE
|
|||
|
|
ORDER BY TABLE_NAME, INDEX_NAME;
|
|||
|
|
|
|||
|
|
-- ================================================
|
|||
|
|
-- 5. 性能测试查询
|
|||
|
|
-- ================================================
|
|||
|
|
|
|||
|
|
SELECT '测试索引效果...' AS info;
|
|||
|
|
|
|||
|
|
-- 测试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;
|
|||
|
|
|
|||
|
|
-- ================================================
|
|||
|
|
-- 完成!
|
|||
|
|
-- ================================================
|
|||
|
|
|
|||
|
|
SELECT '优化完成!' AS info;
|
|||
|
|
SELECT 'Indexes added successfully! Please test import performance.' AS result;
|