238 lines
7.7 KiB
SQL
238 lines
7.7 KiB
SQL
-- 假期留宿状态过滤功能 - 数据库索引优化脚本
|
|
--
|
|
-- 目的:优化假期留宿管理表的查询性能,特别是状态过滤功能
|
|
-- 创建时间:2025-01-28
|
|
-- 适用表:xg_holiday_stay
|
|
|
|
-- =============================================================================
|
|
-- 1. 基础索引:结束日期字段索引
|
|
-- =============================================================================
|
|
|
|
-- 检查是否已存在索引
|
|
SELECT
|
|
INDEX_NAME,
|
|
COLUMN_NAME,
|
|
NON_UNIQUE
|
|
FROM
|
|
INFORMATION_SCHEMA.STATISTICS
|
|
WHERE
|
|
TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'xg_holiday_stay'
|
|
AND COLUMN_NAME = 'apply_end_date';
|
|
|
|
-- 创建结束日期索引(如果不存在)
|
|
-- 这个索引对状态过滤查询非常重要
|
|
SET @sql = '
|
|
CREATE INDEX idx_xg_holiday_stay_apply_end_date
|
|
ON xg_holiday_stay(apply_end_date)
|
|
COMMENT ''假期留宿结束日期索引,用于状态过滤查询优化''';
|
|
|
|
-- 检查索引是否存在,不存在则创建
|
|
SET @index_exists = (
|
|
SELECT COUNT(*)
|
|
FROM INFORMATION_SCHEMA.STATISTICS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'xg_holiday_stay'
|
|
AND INDEX_NAME = 'idx_xg_holiday_stay_apply_end_date'
|
|
);
|
|
|
|
SET @sql = IF(@index_exists = 0, @sql, 'SELECT ''索引 idx_xg_holiday_stay_apply_end_date 已存在'' AS message');
|
|
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- =============================================================================
|
|
-- 2. 复合索引:状态查询优化
|
|
-- =============================================================================
|
|
|
|
-- 创建状态查询复合索引
|
|
-- 包含:租户ID + 删除标志 + 结束日期
|
|
-- 这个索引能显著提升多租户环境下的状态过滤查询性能
|
|
SET @sql = '
|
|
CREATE INDEX idx_xg_holiday_stay_status_query
|
|
ON xg_holiday_stay(tenant_id, deleted, apply_end_date)
|
|
COMMENT ''假期留宿状态查询复合索引,优化多租户环境下的过滤查询''';
|
|
|
|
-- 检查索引是否存在
|
|
SET @index_exists = (
|
|
SELECT COUNT(*)
|
|
FROM INFORMATION_SCHEMA.STATISTICS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'xg_holiday_stay'
|
|
AND INDEX_NAME = 'idx_xg_holiday_stay_status_query'
|
|
);
|
|
|
|
SET @sql = IF(@index_exists = 0, @sql, 'SELECT ''索引 idx_xg_holiday_stay_status_query 已存在'' AS message');
|
|
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- =============================================================================
|
|
-- 3. 学生查询优化索引
|
|
-- =============================================================================
|
|
|
|
-- 创建学生相关查询的复合索引
|
|
-- 包含:学生姓名 + 结束日期,便于按学生筛选时的状态过滤
|
|
SET @sql = '
|
|
CREATE INDEX idx_xg_holiday_stay_student_status
|
|
ON xg_holiday_stay(student_name, apply_end_date)
|
|
COMMENT ''假期留宿学生状态查询索引,优化按学生筛选的状态过滤''';
|
|
|
|
-- 检查索引是否存在
|
|
SET @index_exists = (
|
|
SELECT COUNT(*)
|
|
FROM INFORMATION_SCHEMA.STATISTICS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'xg_holiday_stay'
|
|
AND INDEX_NAME = 'idx_xg_holiday_stay_student_status'
|
|
);
|
|
|
|
SET @sql = IF(@index_exists = 0, @sql, 'SELECT ''索引 idx_xg_holiday_stay_student_status 已存在'' AS message');
|
|
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- =============================================================================
|
|
-- 4. 时间范围查询优化索引
|
|
-- =============================================================================
|
|
|
|
-- 创建时间范围查询的复合索引
|
|
-- 包含:开始日期 + 结束日期,便于时间范围查询
|
|
SET @sql = '
|
|
CREATE INDEX idx_xg_holiday_stay_date_range
|
|
ON xg_holiday_stay(apply_start_date, apply_end_date)
|
|
COMMENT ''假期留宿时间范围查询索引,优化日期范围筛选''';
|
|
|
|
-- 检查索引是否存在
|
|
SET @index_exists = (
|
|
SELECT COUNT(*)
|
|
FROM INFORMATION_SCHEMA.STATISTICS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'xg_holiday_stay'
|
|
AND INDEX_NAME = 'idx_xg_holiday_stay_date_range'
|
|
);
|
|
|
|
SET @sql = IF(@index_exists = 0, @sql, 'SELECT ''索引 idx_xg_holiday_stay_date_range 已存在'' AS message');
|
|
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- =============================================================================
|
|
-- 5. 索引使用情况分析
|
|
-- =============================================================================
|
|
|
|
-- 查看表的所有索引
|
|
SELECT
|
|
INDEX_NAME AS '索引名称',
|
|
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS '索引字段',
|
|
INDEX_TYPE AS '索引类型',
|
|
NON_UNIQUE AS '是否唯一',
|
|
INDEX_COMMENT AS '索引注释'
|
|
FROM
|
|
INFORMATION_SCHEMA.STATISTICS
|
|
WHERE
|
|
TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'xg_holiday_stay'
|
|
GROUP BY
|
|
INDEX_NAME, INDEX_TYPE, NON_UNIQUE, INDEX_COMMENT
|
|
ORDER BY
|
|
INDEX_NAME;
|
|
|
|
-- =============================================================================
|
|
-- 6. 查询性能测试示例
|
|
-- =============================================================================
|
|
|
|
-- 设置查询性能测试变量
|
|
SET @current_time = NOW();
|
|
SET @test_tenant_id = 1; -- 替换为实际的租户ID
|
|
|
|
-- 测试1:有效状态查询
|
|
EXPLAIN
|
|
SELECT
|
|
id, student_name, apply_end_date, tenant_id
|
|
FROM
|
|
xg_holiday_stay
|
|
WHERE
|
|
tenant_id = @test_tenant_id
|
|
AND deleted = 0
|
|
AND apply_end_date >= @current_time
|
|
AND apply_end_date IS NOT NULL
|
|
LIMIT 10;
|
|
|
|
-- 测试2:失效状态查询
|
|
EXPLAIN
|
|
SELECT
|
|
id, student_name, apply_end_date, tenant_id
|
|
FROM
|
|
xg_holiday_stay
|
|
WHERE
|
|
tenant_id = @test_tenant_id
|
|
AND deleted = 0
|
|
AND (apply_end_date < @current_time OR apply_end_date IS NULL)
|
|
LIMIT 10;
|
|
|
|
-- 测试3:按学生名称 + 状态查询
|
|
EXPLAIN
|
|
SELECT
|
|
id, student_name, apply_end_date, tenant_id
|
|
FROM
|
|
xg_holiday_stay
|
|
WHERE
|
|
student_name LIKE '%张%'
|
|
AND apply_end_date >= @current_time
|
|
AND apply_end_date IS NOT NULL
|
|
LIMIT 10;
|
|
|
|
-- =============================================================================
|
|
-- 7. 索引维护建议
|
|
-- =============================================================================
|
|
|
|
/*
|
|
索引维护建议:
|
|
|
|
1. 监控索引使用情况
|
|
- 定期检查索引的使用频率
|
|
- 删除未使用的索引以减少存储开销
|
|
|
|
2. 索引大小监控
|
|
- 监控索引占用的存储空间
|
|
- 当数据量增长时,考虑索引的分区策略
|
|
|
|
3. 查询性能监控
|
|
- 定期分析慢查询日志
|
|
- 使用EXPLAIN分析查询执行计划
|
|
|
|
4. 数据更新频率考量
|
|
- apply_end_date字段更新不频繁,适合建立索引
|
|
- 如果业务场景中该字段更新频繁,需要权衡索引维护成本
|
|
|
|
5. 定期重建索引(可选)
|
|
- 对于频繁更新的表,可以定期重建索引以优化性能
|
|
- 命令:ALTER TABLE xg_holiday_stay ENGINE=InnoDB;
|
|
*/
|
|
|
|
-- =============================================================================
|
|
-- 8. 清理脚本(如需删除索引)
|
|
-- =============================================================================
|
|
|
|
/*
|
|
-- 如果需要删除创建的索引,可以使用以下命令:
|
|
|
|
DROP INDEX idx_xg_holiday_stay_apply_end_date ON xg_holiday_stay;
|
|
DROP INDEX idx_xg_holiday_stay_status_query ON xg_holiday_stay;
|
|
DROP INDEX idx_xg_holiday_stay_student_status ON xg_holiday_stay;
|
|
DROP INDEX idx_xg_holiday_stay_date_range ON xg_holiday_stay;
|
|
*/
|
|
|
|
-- =============================================================================
|
|
-- 执行完成提示
|
|
-- =============================================================================
|
|
|
|
SELECT
|
|
'✅ 假期留宿状态过滤索引优化脚本执行完成' AS message,
|
|
NOW() AS execution_time,
|
|
'请查看上述输出确认索引创建情况' AS note; |