接到一个不确定+复杂的需求(对我而言),背景是: 现在后台有一个用户表 user ( id,orderId),会员订单表 order(id,type,expireTime),用户每日登录日志表 log(id,uid,createdAt);表的行数基本在 100 万(订单表 10 万)。 现在需要可能是:
- 找到最近 10 天登录的用户
- 或者,最近 10 天登录的会员用户(根据有没有订单 id )
- 或者,最近 10 天登录的过期会员用户
...others
根据条件拿到用户 id 去做其他任务,就是条件可能不一样。
根据我仅有的 MySql 知识和这两天的 Google,我试了一下实现是,
select user.*, order.*, max(log.createdAt) from user
join order on user.orderId = order.id -- 如果要过期用户,这里加一个 expireTime 判断
join log on log.uid = user.id and log.createdAt > '2021-10-01 00:00:00'
group by user.id -- 这是配合 join log on 获取最新登录一次的时间
现在我的问题是:
- 各位大佬遇到这种需求是不是这样的,如果需求增加或变了再调整 sql 的拼接(好像无法实现一个大的逻辑去嵌套小的条件适应需求变化?)
- 这里一共需要三个表 join,我造了 100 万行的数据测试,发现执行一次大概要 15 秒左右。查了资料,看到说不要用 join,或者根据让小表驱动大表,建索引等操作,这些都在试(学);不过还是问一下大佬有没有建议?