(比如说巡逻车辆ID,环卫车辆的ID,公交车,微公交的ID)。

    另外有一张日志表B,每条记录中的ID是来自前面那张小表的,但不是每个ID都出现在这张日志表中,比如说一天可能只有几十个ID会出现在这个日志表的当天的数据中。

    (比如车辆的行车轨迹数据,每秒上报轨迹,数据量就非常庞大)。

    那么我怎么快速的找出今天没有出现的ID呢。

    (哪些巡逻车辆没有出现在这个片区,是不是偷懒了?哪些环卫车辆没有出行,哪些公交或微公交没有出行)?

    select id from A where id not in (select id from B where time between ? and ?);

    当然,你还可以让车辆签到的方式来解决这个问题,但是总有未签到的,或者没有这种设计的时候,那么怎么解决呢?

    优化方法

    其实方法也很精妙,和我之前做的两个CASE很相似。

    《时序数据合并场景加速分析和实现 - 复合索引,窗口分组查询加速,变态递归加速》

    在B表中,其实ID的值是很稀疏的,只是由于是流水,所以总量大。

    优化的手段就是对B的取值区间,做递归的收敛查询,然后再做NOT IN就很快了。

    建表

    插入测试数据

    优化前的性能

    另外你有一种选择是使用outer join, b表同样需要全扫一遍,有很大的改进,不过还可以更好,继续往后看。

    递归收敛优化后的性能

    采用收敛查询优化后,耗时从最初的 618794毫秒 降低到了 11毫秒 ,感觉一下子节约了好多青春。