MySQL对比当前时间更新设备在线状态 UPDATE语句全表被修改问题
问题根因
你写的所有UPDATE语句都没有加WHERE限定条件,默认会作用于全表所有行,所以每次执行UPDATE都会把整张表的statusConnection统一修改,循环执行多次也没有意义,最终全表状态只会和最后一次执行的UPDATE设置的值一致。
你当前的逻辑是「先查符合条件的行,再循环逐次更新全表」,属于完全冗余的写法,不需要先查询再循环处理,直接用带条件的UPDATE语句就能一步完成所有更新操作,性能提升非常明显。
优化后的正确代码
// 更新所有符合在线条件的设备 $onlineSql = "UPDATE PlantData SET statusConnection = 'online' WHERE lastUpdate > DATE_SUB(NOW(), INTERVAL 15 MINUTE)"; mysqli_query($connection, $onlineSql); // 更新所有符合离线条件的设备 $offlineSql = "UPDATE PlantData SET statusConnection = 'offline' WHERE lastUpdate < DATE_SUB(NOW(), INTERVAL 15 MINUTE)"; mysqli_query($connection, $offlineSql);
额外注意事项
- 注意
lastUpdate差值刚好等于15分钟的边界情况,如果需要覆盖这种场景,可以根据业务需求把其中一个条件的比较符号改成>=或者<=,避免出现漏更新的行。 - 如果表数据量很大,建议给
lastUpdate字段加索引,能大幅提升UPDATE的执行效率。
内容的提问来源于stack exchange,提问作者Nicola Rigoni
相关产品推荐
相关产品推荐

