我的数据库中有5个表:user,log1,log2,log3和log4。 每个日志都保存有关用户的数据(log1是登录日志等) - 每个日志都有UserID,CreateTime和LogID作为列。
我想创建一个足够快的查询,它会显示每个日志拥有此用户ID的次数。类似的东西:
select u.UserID, Count(log1.CreateTime) as l1, ... Count(log4.CreateTime) as l4
from users u left join log1 on log1.UserID = u.UserID left join ...
group by u.UserID
问题是此查询花费了太多时间。
有人可以帮我优化查询吗?
答案 0 :(得分:2)
对于此查询:
select u.UserID, Count(log1.CreateTime) as l1, ... Count(log4.CreateTime) as l4
from users u left join
log1
on log1.UserID = u.UserID left join ...
group by u.UserID
您希望“日志”表中的索引:log1(UserId)
等
但是,我认为这不是你真正想要的。使用相同的索引,您应该使用相关子查询:
select u.*,
(select count(*) from log1 where log1.UserID = u.UserID) as log1_cnt,
. . .
from users u;
(这假设创建日期/时间列永远不是NULL
。)
这样做有几个原因:
group by
。答案 1 :(得分:0)
我想,您希望获得日志记录的统计信息。
我们有日志数据库,每天插入大约1万条记录。我们创建统计数据库并在日志表上添加触发器以进行插入。因此,我们更新或插入每个日志插入的统计记录。