如何高效筛选百万级activity_logs表中活动时段内下单的用户?
高效筛选活动时段内完成下单操作的用户SQL实现
需求说明
基于百万级数据量的activity_logs用户活动记录表,以及记录应用活动时段的offer_logs表,筛选出**在活动时段内完成下单核心操作(如check_out、payment)**的用户ID。
核心SQL实现
SELECT DISTINCT a.id FROM activity_logs a JOIN offer_logs b ON a.time BETWEEN b.time_on AND b.time_off WHERE a.activity IN ('check_out', 'payment');
效率优化要点(针对百万级数据)
- 给
activity_logs建立复合覆盖索引:CREATE INDEX idx_activity_time_id ON activity_logs(activity, time, id);
该索引先通过activity快速过滤出下单相关操作的记录,再用time完成时段匹配,最后直接返回id,避免回表查询,大幅提升查询速度。 - 给
offer_logs建立时段索引:CREATE INDEX idx_time_range ON offer_logs(time_on, time_off);
即使offer_logs数据量不大,该索引也能加速时段匹配的判断逻辑,减少关联时的计算开销。
结果验证
上述SQL会匹配到用户2的check_out(10:11)和payment(10:12)操作均落在活动时段10:04-10:15内,最终返回唯一用户ID2,与预期结果一致。
内容的提问来源于stack exchange,提问作者and_ayush
相关产品推荐
相关产品推荐

