-- ===================================================== -- 内存优化相关数据库索引优化脚本 -- 用于提升GPS相关查询性能,减少慢查询导致的内存占用 -- ===================================================== -- 执行前请先备份数据库! -- 执行方式: mysql -u root -p 数据库名 < optimize_memory_indexes.sql -- ===================================================== USE `966120`; -- ===================================================== -- 1. GPS数据表索引优化 -- ===================================================== -- 检查 tb_vehicle_gps 表的现有索引 SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, INDEX_TYPE FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '966120' AND TABLE_NAME = 'tb_vehicle_gps' ORDER BY INDEX_NAME, SEQ_IN_INDEX; -- 添加车辆ID和采集时间的组合索引(用于GPS分段查询) -- 此索引可大幅提升 selectActiveVehicleIds 和 selectGpsDataByTimeRange 查询性能 ALTER TABLE tb_vehicle_gps ADD INDEX idx_vehicle_collect_time (vehicle_id, collect_time) COMMENT 'GPS分段查询优化索引'; -- 添加采集时间单独索引(用于时间范围查询) ALTER TABLE tb_vehicle_gps ADD INDEX idx_collect_time (collect_time) COMMENT 'GPS时间范围查询索引'; -- 添加设备ID索引(用于GPS同步查询) ALTER TABLE tb_vehicle_gps ADD INDEX idx_device_id (device_id) COMMENT 'GPS设备ID查询索引'; -- ===================================================== -- 2. GPS分段里程表索引优化 -- ===================================================== -- 检查 vehicle_gps_segment_mileage 表的现有索引 SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, INDEX_TYPE FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '966120' AND TABLE_NAME = 'vehicle_gps_segment_mileage' ORDER BY INDEX_NAME, SEQ_IN_INDEX; -- 添加车辆ID和分段开始时间的组合索引 ALTER TABLE vehicle_gps_segment_mileage ADD INDEX idx_vehicle_segment_start (vehicle_id, segment_start_time) COMMENT '车辆分段查询索引'; -- 添加任务ID索引(用于任务关联查询) ALTER TABLE vehicle_gps_segment_mileage ADD INDEX idx_task_id (task_id) COMMENT '任务关联查询索引'; -- 添加分段时间范围索引(用于统计汇总) ALTER TABLE vehicle_gps_segment_mileage ADD INDEX idx_segment_time_range (segment_start_time, segment_end_time) COMMENT '分段时间范围查询索引'; -- ===================================================== -- 3. GPS已计算记录表索引优化 -- ===================================================== -- 检查 vehicle_gps_calculated 表是否存在 SELECT COUNT(*) as table_exists FROM information_schema.TABLES WHERE TABLE_SCHEMA = '966120' AND TABLE_NAME = 'vehicle_gps_calculated'; -- 如果表存在,添加索引 ALTER TABLE vehicle_gps_calculated ADD INDEX idx_gps_id (gps_id) COMMENT 'GPS点查询索引'; ALTER TABLE vehicle_gps_calculated ADD INDEX idx_vehicle_segment (vehicle_id, segment_id) COMMENT '车辆分段关联索引'; -- ===================================================== -- 4. 任务表索引优化 -- ===================================================== -- 添加车辆ID和时间范围的组合索引(用于关联任务查询) ALTER TABLE sys_task ADD INDEX idx_vehicle_time_range ( vehicle_id, actual_start_time, actual_end_time ) COMMENT '车辆任务时间范围查询索引'; -- 添加任务状态和计划时间索引(用于定时任务查询) ALTER TABLE sys_task ADD INDEX idx_status_planned_time ( task_status, planned_start_time ) COMMENT '任务状态时间查询索引'; -- ===================================================== -- 5. 急救转运任务表索引优化 -- ===================================================== -- 添加同步状态索引(用于旧系统同步任务) ALTER TABLE sys_task_emergency ADD INDEX idx_sync_status (sync_status) COMMENT '同步状态查询索引'; -- 添加调度单同步状态索引 ALTER TABLE sys_task_emergency ADD INDEX idx_dispatch_sync_status (dispatch_sync_status) COMMENT '调度单同步状态查询索引'; -- 添加旧系统ID组合索引(用于双向同步查询) ALTER TABLE sys_task_emergency ADD INDEX idx_legacy_ids ( legacy_service_ord_id, legacy_dispatch_ord_id ) COMMENT '旧系统ID查询索引'; -- ===================================================== -- 6. 车辆信息表索引优化 -- ===================================================== -- 添加设备ID索引(用于GPS关联查询) ALTER TABLE tb_vehicle_info ADD INDEX idx_device_id (device_id) COMMENT '设备ID查询索引'; -- 添加车牌号索引(用于车辆查询) ALTER TABLE tb_vehicle_info ADD INDEX idx_vehicle_no (vehicle_no) COMMENT '车牌号查询索引'; -- ===================================================== -- 7. 车辆里程统计表索引优化 -- ===================================================== -- 检查 vehicle_mileage_stats 表的现有索引 SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, INDEX_TYPE FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '966120' AND TABLE_NAME = 'vehicle_mileage_stats' ORDER BY INDEX_NAME, SEQ_IN_INDEX; -- 添加车辆ID和统计日期的组合索引 ALTER TABLE vehicle_mileage_stats ADD INDEX idx_vehicle_stat_date (vehicle_id, stat_date) COMMENT '车辆统计日期查询索引'; -- 添加统计日期索引(用于批量查询) ALTER TABLE vehicle_mileage_stats ADD INDEX idx_stat_date (stat_date) COMMENT '统计日期查询索引'; -- ===================================================== -- 8. 验证索引创建结果 -- ===================================================== -- 查看所有新增索引 SELECT TABLE_NAME as '表名', INDEX_NAME as '索引名', GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as '索引列', INDEX_TYPE as '索引类型', COMMENT as '备注' FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '966120' AND TABLE_NAME IN ( 'tb_vehicle_gps', 'vehicle_gps_segment_mileage', 'vehicle_gps_calculated', 'sys_task', 'sys_task_emergency', 'tb_vehicle_info', 'vehicle_mileage_stats' ) AND INDEX_NAME LIKE 'idx_%' GROUP BY TABLE_NAME, INDEX_NAME ORDER BY TABLE_NAME, INDEX_NAME; -- ===================================================== -- 9. 查询性能测试 -- ===================================================== -- 测试GPS分段查询性能 EXPLAIN SELECT vehicle_id FROM tb_vehicle_gps WHERE collect_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY vehicle_id; -- 测试车辆分段里程查询性能 EXPLAIN SELECT * FROM vehicle_gps_segment_mileage WHERE vehicle_id = 1 AND segment_start_time >= DATE_SUB(NOW(), INTERVAL 1 DAY); -- 测试任务关联查询性能 EXPLAIN SELECT t.* FROM sys_task t WHERE t.vehicle_id = 1 AND t.actual_start_time >= DATE_SUB(NOW(), INTERVAL 1 DAY) AND t.actual_end_time <= NOW(); -- ===================================================== -- 10. 索引使用统计(可选) -- ===================================================== -- 启用性能统计(MySQL 8.0+) -- UPDATE performance_schema.setup_instruments -- SET ENABLED = 'YES', TIMED = 'YES' -- WHERE NAME LIKE '%statement/%'; -- 查看慢查询统计 SELECT SCHEMA_NAME as '数据库', DIGEST_TEXT as '查询语句', COUNT_STAR as '执行次数', AVG_TIMER_WAIT/1000000000 as '平均耗时(秒)', SUM_ROWS_EXAMINED as '扫描行数' FROM performance_schema.events_statements_summary_by_digest WHERE SCHEMA_NAME = '966120' ORDER BY AVG_TIMER_WAIT DESC LIMIT 10; -- ===================================================== -- 完成提示 -- ===================================================== SELECT '====================================' as ''; SELECT '索引优化脚本执行完成!' as '提示'; SELECT '请检查上述验证结果,确认索引已正确创建' as '说明'; SELECT '建议重启应用服务,让新索引生效' as '建议'; SELECT '====================================' as ''; -- ===================================================== -- 回滚脚本(如需删除索引) -- ===================================================== /* -- 如果需要回滚,执行以下语句: ALTER TABLE tb_vehicle_gps DROP INDEX idx_vehicle_collect_time; ALTER TABLE tb_vehicle_gps DROP INDEX idx_collect_time; ALTER TABLE tb_vehicle_gps DROP INDEX idx_device_id; ALTER TABLE vehicle_gps_segment_mileage DROP INDEX idx_vehicle_segment_start; ALTER TABLE vehicle_gps_segment_mileage DROP INDEX idx_task_id; ALTER TABLE vehicle_gps_segment_mileage DROP INDEX idx_segment_time_range; ALTER TABLE vehicle_gps_calculated DROP INDEX idx_gps_id; ALTER TABLE vehicle_gps_calculated DROP INDEX idx_vehicle_segment; ALTER TABLE sys_task DROP INDEX idx_vehicle_time_range; ALTER TABLE sys_task DROP INDEX idx_status_planned_time; ALTER TABLE sys_task_emergency DROP INDEX idx_sync_status; ALTER TABLE sys_task_emergency DROP INDEX idx_dispatch_sync_status; ALTER TABLE sys_task_emergency DROP INDEX idx_legacy_ids; ALTER TABLE tb_vehicle_info DROP INDEX idx_device_id; ALTER TABLE tb_vehicle_info DROP INDEX idx_vehicle_no; ALTER TABLE vehicle_mileage_stats DROP INDEX idx_vehicle_stat_date; ALTER TABLE vehicle_mileage_stats DROP INDEX idx_stat_date; */