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