2016-03-28 175 views
0

我在我的DB中有5个表:用户,log1,log2,log3和log4。 每个日志都会保存有关用户的数据(log1是登录日志等) - 每个日志都有UserID和CreateTime以及LogID作为其列。优化mysql查询

我想创建一个足够快的查询,它会告诉我每个日志有这个用户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 

问题是此查询花费的时间太多。

任何人都可以帮助我优化我的查询吗?

+1

检查查询的执行计划以确定事情发生的速度缓慢。我的猜测是你需要某个索引。 –

+0

你的RDBMS是什么? Sql Server,MySql例如 –

+0

@HasanBİNBOĞAmysql。 – LordKalmar

回答

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。)

这是有几个原因更好:

  • 它做了正确的计数。您的版本为四列生成相同的计数(或0)。
  • 这不会为给定用户为四个表中的记录创建中间Cartesian产品。
  • 这不会在外部查询中使用group by
  • 索引可用于相关子查询。
0

我想,你想得到你的日志记录的统计数据。

我们有日志数据库,每天插入大约1毫安的记录。我们创建统计数据库并在日志表上添加触发器以进行插入。所以我们更新或插入每个日志插入的统计记录。