mysql查询数据缺失的时间点

客户端理论上每分钟会发送一条数据到服务器端并且保存至mysql数据库的分钟数据表里,然后生成一条记录,每条记录都有一个唯一的客户端编码ID和数据上传的时间upload_ttime。但实际上偶尔客户端会由于各种原因没办法做到每一分钟都有数据上来。怎么高效的查询哪个时间点没有数据?

需要实时上报吗?不需要的话在更新新的时间节点时增加一个sql查询指令

收到客户端的消息数据存储同时记录一个时标,再次收到消息后对比之前的时标理论上(等于1分钟)如果大于1分钟则表示上次或者前几次没有上送数据。

没有数据的话,那肯定需要全部现有数据去分析出来,直接思路就是拿到所有的upload_time,然后看有没有不连续的,这样其实不算很好的方式。我的思路是你后台加个定时任务,每分钟去查一下有没有数据,没有的话就插入一条,表加个标志位字段来分别出是上传的数据和定时任务插入的。如果时效性不是很高,可以差前一分钟或者两分钟的,比如现在14:30,你可以去查14:27,14:28的有没有数据,然后14:31的时候就差14:28,14:29的。然后你查哪个时间点没有数据的话,就直接用加的那个标志位去where就行了。

建一个没有上送数据的时间记录表(记录缺失的时间点或时间段);
服务端每次插入新数据的时候查询一下前几分钟是否有数据上来
1、如果有就正常走逻辑;
2、如果没有就继续往前查直到有数据为止,创建一条记录插入到上面的表里面;
想知道哪些时间段没有上送数据的时候就去查这个表就可以了。

如果现在已经成型了,想从分钟数据表里面直接查出缺失的时间点的话,建一个时间表可以是一个小时的也可以是一天的,然后用这个表去left join你的记录表,以分钟为对应关系关联,记录表没数据的就是没有记录的呗。这个需要根据你建的时间表去分段查询。

每天1440秒,一共180b就能存住一天的数据量。入库的时候将这个字节数据对应的秒数存储到相应的位(b)上。这样你就会得到一个[1,1,1,0,1,1,0,0......]数组,这个byte中有180个字节,每个字节存储是否上线,存储mysql的时候更新对应的位。查询的时候找到对应的位置换成对应的第几秒就可以了。以空间换时间。空间也不大,一个机器一天180b

可以生成一个24小时的时刻表,然后通过时刻和记录表通过时刻进行左关联最终取记录表信息为null的值即为数据缺失的时间点

建议:

  1. 定时上传的数据不要直接写入数据库,可以走消息队列,数据写入到像es这类数据库。
  2. 使用mysql,建议做分表,按照日期或者业务规则进行分表,降低查询负载

问题的原因可能是:
采用的定时任务写入,某一时刻服务器的cpu没有空闲,不能及时处理当前任务,导致当前任务等待执行;在等待的过程中,数据库连接超时,后续的事务无法提交,导致数据丢失。

1、你可以单独记录
2、你可以带时间点去查