You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL使用MIN()分组查询时获取最小值对应时间的优化方案

问题根因

你当前使用的SQL存在逻辑漏洞:在MySQL未开启ONLY_FULL_GROUP_BY模式时,GROUP BY语句中未做聚合处理的非分组字段(此处为temp_time),会返回分组内扫描到的第一条记录的对应值,不会自动匹配MIN(temp_value)所在行的数据,因此会出现最低温度数值正确、但对应时间错误的问题。这种返回结果不受业务逻辑控制,表数据存储顺序、索引变动都会导致返回的时间值变化,不能依赖这种隐式规则取数。

高性能查询方案

针对你提到的表数据量较大的场景,优先通过索引优化+关联查询的方式实现,千万级数据量下也能保持毫秒级响应:

  1. 首先创建联合覆盖索引,避免查询时回表扫描数据:
CREATE INDEX idx_sensor_val_time ON nd_sensor_value(sensor_id, temp_value, temp_time);
  1. 使用子查询先聚合出两个目标传感器的最低温度值,再关联原表取出对应采集时间:
SELECT
    t.sensor_id,
    t.temp_value AS value,
    t.temp_time
FROM nd_sensor_value t
JOIN (
    SELECT
        sensor_id,
        MIN(temp_value) AS min_temp
    FROM nd_sensor_value
    WHERE sensor_id IN ('TEMP_1', 'TEMP_2')
    GROUP BY sensor_id
) tmp ON t.sensor_id = tmp.sensor_id AND t.temp_value = tmp.min_temp
WHERE t.sensor_id IN ('TEMP_1', 'TEMP_2');
方案说明
  • 用IN匹配目标传感器ID,查询优化器对IN条件的索引选择效率高于多个OR拼接的条件
  • 子查询计算最小值的逻辑可以直接在之前创建的联合索引上完成,不需要扫描全表数据
  • 如果单个传感器存在多条温度值等于最低温度的采集记录,上述查询会返回所有匹配记录;如果仅需要返回其中一条,可以在外层查询追加GROUP BY sensor_id,或增加ORDER BY temp_time类的逻辑按需求取数即可。

内容的提问来源于stack exchange,提问作者Skywatcher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:27:22