wlzboy
2026-03-31 61c4c3f45e4257e2e7662f033e2719e62366c632
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
-- =====================================================
-- 内存优化相关数据库索引优化脚本
-- 用于提升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;
*/