wlzboy
5 天以前 fe33646ee6e2d1e57f2b51812e94983a0e9efb04
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
-- GPS查询性能优化SQL
-- 用于解决GPS分段里程计算任务查询超时问题
 
-- 1. 检查tb_vehicle_gps表的索引
SHOW INDEX FROM tb_vehicle_gps;
 
-- 2. 添加组合索引:vehicle_id + collect_time(如果不存在)
-- 这个索引可以大幅提升按车辆ID和时间范围查询的性能
ALTER TABLE tb_vehicle_gps 
ADD INDEX idx_vehicle_collect_time (vehicle_id, collect_time);
 
-- 3. 添加单列索引:collect_time(如果不存在)
-- 这个索引用于优化查询活跃车辆ID的查询
ALTER TABLE tb_vehicle_gps 
ADD INDEX idx_collect_time (collect_time);
 
-- 4. 检查tb_vehicle_gps_calculated表的索引
SHOW INDEX FROM tb_vehicle_gps_calculated;
 
-- 5. 优化tb_vehicle_gps_calculated表索引
-- 添加gps_id索引(如果不存在),用于LEFT JOIN查询优化
ALTER TABLE tb_vehicle_gps_calculated 
ADD INDEX idx_gps_id (gps_id);
 
-- 6. 添加vehicle_id索引,用于按车辆查询已计算记录
ALTER TABLE tb_vehicle_gps_calculated 
ADD INDEX idx_vehicle_id (vehicle_id);
 
-- 7. 查看表的统计信息
ANALYZE TABLE tb_vehicle_gps;
ANALYZE TABLE tb_vehicle_gps_calculated;
 
-- 8. 查看索引使用情况
-- 执行以下查询来验证索引是否被正确使用
EXPLAIN SELECT DISTINCT vehicle_id
FROM tb_vehicle_gps
WHERE collect_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
ORDER BY vehicle_id;
 
EXPLAIN SELECT g.gps_id, g.vehicle_id, g.device_id, g.longitude, g.latitude, 
       g.altitude, g.speed, g.direction, g.collect_time
FROM tb_vehicle_gps g
LEFT JOIN tb_vehicle_gps_calculated c ON g.gps_id = c.gps_id
WHERE g.vehicle_id = 1
  AND g.collect_time >= DATE_SUB(NOW(), INTERVAL 1 DAY)
  AND g.collect_time <= NOW()
  AND c.gps_id IS NULL
ORDER BY g.collect_time;
 
-- 9. 性能优化建议
/*
执行结果说明:
- type应该是ref或range,不应该是ALL(全表扫描)
- key应该显示使用了相应的索引
- rows应该尽可能少
 
如果发现索引未被使用,可能需要:
1. 更新表统计信息:ANALYZE TABLE
2. 检查MySQL版本是否支持索引优化
3. 考虑增加MySQL的innodb_buffer_pool_size配置
*/
 
-- 10. 清理历史GPS数据(可选,定期执行)
-- 建议保留最近30-90天的数据,避免表过大影响查询性能
/*
DELETE FROM tb_vehicle_gps 
WHERE collect_time < DATE_SUB(NOW(), INTERVAL 90 DAY);
 
-- 优化表空间
OPTIMIZE TABLE tb_vehicle_gps;
*/