-- ======================================== -- 测试里程统计优化效果 -- 用途:对比优化前后的性能和准确性 -- ======================================== -- 1. 查看某个车辆某天的分段数据task_id覆盖率 -- 替换参数:@vehicleId, @statDate SET @vehicleId = 1; -- 替换为实际车辆ID SET @statDate = '2025-12-04'; -- 替换为实际日期 SELECT '分段统计' as '类型', COUNT(*) as '总分段数', SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) as '有任务ID的分段数', CONCAT(ROUND(SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') as 'task_id覆盖率' FROM tb_vehicle_gps_segment_mileage WHERE vehicle_id = @vehicleId AND DATE(segment_start_time) = @statDate; -- 2. 对比两种计算方式的结果 -- 方式A:优化方案(直接按task_id聚合) SELECT '优化方案' as '计算方式', SUM(segment_distance) as '总里程', SUM(CASE WHEN task_id IS NOT NULL THEN segment_distance ELSE 0 END) as '任务里程', SUM(CASE WHEN task_id IS NULL THEN segment_distance ELSE 0 END) as '非任务里程', CONCAT(ROUND(SUM(CASE WHEN task_id IS NOT NULL THEN segment_distance ELSE 0 END) * 100.0 / NULLIF(SUM(segment_distance), 0), 2), '%') as '任务占比' FROM tb_vehicle_gps_segment_mileage WHERE vehicle_id = @vehicleId AND DATE(segment_start_time) = @statDate; -- 方式B:当前统计表中的数据(可能使用了时间重叠计算) SELECT '统计表数据' as '计算方式', total_mileage as '总里程', task_mileage as '任务里程', non_task_mileage as '非任务里程', CONCAT(ROUND(task_ratio * 100, 2), '%') as '任务占比' FROM tb_vehicle_mileage_stats WHERE vehicle_id = @vehicleId AND DATE(stat_date) = @statDate; -- 3. 查看使用优化方案的车辆数量(task_id覆盖率 > 80%) SELECT DATE(segment_start_time) as '日期', vehicle_id, vehicle_no, COUNT(*) as '总分段数', SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) as '有task_id分段数', CONCAT(ROUND(SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') as '覆盖率', CASE WHEN SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) > COUNT(*) * 0.8 THEN '✓ 使用优化方案' ELSE '× 使用降级方案' END as '方案选择' FROM tb_vehicle_gps_segment_mileage WHERE segment_start_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY DATE(segment_start_time), vehicle_id, vehicle_no HAVING COUNT(*) > 10 -- 只统计分段数大于10的 ORDER BY DATE(segment_start_time) DESC, vehicle_id LIMIT 20; -- 4. 统计整体优化效果 SELECT '整体统计' as '统计类型', COUNT(DISTINCT CONCAT(vehicle_id, '_', DATE(segment_start_time))) as '车辆-日期组合总数', SUM(CASE WHEN task_coverage > 0.8 THEN 1 ELSE 0 END) as '可使用优化方案的数量', CONCAT(ROUND(SUM(CASE WHEN task_coverage > 0.8 THEN 1 ELSE 0 END) * 100.0 / COUNT(DISTINCT CONCAT(vehicle_id, '_', DATE(segment_start_time))), 2), '%') as '优化覆盖率' FROM ( SELECT vehicle_id, DATE(segment_start_time) as stat_date, SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as task_coverage FROM tb_vehicle_gps_segment_mileage WHERE segment_start_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY vehicle_id, DATE(segment_start_time) HAVING COUNT(*) > 10 ) coverage_stats; -- 5. 性能测试:执行时间对比 -- 说明:使用EXPLAIN ANALYZE查看执行计划(MySQL 8.0+)或使用BENCHMARK函数 -- 优化方案查询(直接聚合) EXPLAIN SELECT vehicle_id, SUM(CASE WHEN task_id IS NOT NULL THEN segment_distance ELSE 0 END) as task_mileage, SUM(CASE WHEN task_id IS NULL THEN segment_distance ELSE 0 END) as non_task_mileage FROM tb_vehicle_gps_segment_mileage WHERE vehicle_id = @vehicleId AND DATE(segment_start_time) = @statDate GROUP BY vehicle_id; -- 6. 建议的优化措施 SELECT '优化建议' as '类型', '补充历史数据的task_id' as '措施1', '确保定时任务正常运行' as '措施2', '确保任务状态正确更新' as '措施3', '定期检查task_id覆盖率' as '措施4'; -- ======================================== -- 使用说明: -- 1. 设置参数:修改第7-8行的@vehicleId和@statDate -- 2. 执行查询1-4查看优化效果 -- 3. 如果覆盖率低于80%,执行fix_segment_mileage_task_association.sql修复 -- 4. 重新统计,观察性能提升 -- ========================================