-- 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;
*/
